据我了解ArrayList,默认容量为10,并且当其超过10时,它将创建具有新容量的新对象,依此类推。
ArrayList
因此,出于好奇,我输入下面的程序来检查hashcode()的ArrayList对象:
hashcode()
public class TestCoreJava { public static void main(String [] args){ ArrayList al = new ArrayList(); for(int i=0;i<15;i++){ al.add("Temp"+i); System.out.println("Hashcode for "+i+" element "+al.hashCode()); } } }
根据上述情况,当我未将ArrayList默认初始容量设置为10时,因此在添加第11个元素时,它将创建一个新对象并增加的容量ArrayList。
当我打印ArrayList对象的哈希码时,hashcode()每次都会给出一个新值。
以下是o / p:
Hashcode for 0 element 80692955 Hashcode for 1 element -1712792766 Hashcode for 2 element -1476275268 Hashcode for 3 element 1560799875 Hashcode for 4 element 1220848797 Hashcode for 5 element -727700028 Hashcode for 6 element -1003171458 Hashcode for 7 element -952851195 Hashcode for 8 element 607076959 Hashcode for 9 element 1720209478 Hashcode for 10 element -6600307 Hashcode for 11 element -1998096089 Hashcode for 12 element 690044110 Hashcode for 13 element -1876955640 Hashcode for 14 element 150430735
根据默认容量的概念,直到第10个元素之前,都应打印相同的内容,hashcode()因为在此之前不需要创建任何新对象,但事实并非如此。
在hashCode的ArrayList是一个功能hashCode都存储在该元件S1 ArrayList,所以当容量的变化,它的变化当添加或删除元素或改变其的hashCode办法元素发生变异一个它不会改变。
hashCode
这是Java 8实现(实际上是在中实现的AbstractList):
AbstractList
public int hashCode() { int hashCode = 1; for (E e : this) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); return hashCode; }
顺便说一句,这是出现在hashCode()该List接口的Javadoc中的确切代码:
hashCode()
List
int java.util.List.hashCode() 返回此列表的哈希码值。列表的哈希码定义为以下计算的结果:
int java.util.List.hashCode()
返回此列表的哈希码值。列表的哈希码定义为以下计算的结果:
int hashCode = 1; for (E e : list) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());