suy*_*ash 19 java collections arraylist hashcode
根据我的理解ArrayList,默认容量为10,当它超过10时,它将创建一个具有新容量的新对象,依此类推.
因此,出于好奇,我输入下面的程序来检查hashcode()的ArrayList对象:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据上面的场景,当我没有设置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
Run Code Online (Sandbox Code Playgroud)
根据默认容量的概念,直到第10个元素它应该打印相同,hashcode()因为在此之前不需要创建新对象,但事实并非如此.
Era*_*ran 42
该hashCode的ArrayList是函数hashCode存储在所有元件S1 ArrayList,因此它不会当容量的变化,它的变化,每当您添加或更改删除元素或突变在改变其的hashCode办法的要素之一.
这是Java 8实现(它实际上是在实现中AbstractList):
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这是出现在Javadoc中确切的代码hashCode()中的List界面:
int java.util.List.hashCode()
返回此列表的哈希码值.列表的哈希码被定义为以下计算的结果:
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)
所述hashCode的List实施方式是在条款中定义hashCode它的元素的。这意味着ArrayList要成为一致的List实现,hashCode 必须在内容更改时更改它。
更笼统地说:对于易变的对象,hashCode只要它们发生更改,就应该更改它们,使其不会equal回到先前的状态。
您似乎以为它使用的默认hashCode值为Object,情况并非如此。
此外,即使ArrayList未实现hashCode,如果内部数组被重新分配,则的默认哈希码(也称为标识哈希码)ArrayList也不会更改,因为ArrayList对象本身保持不变,只是内部数组对象(即您无法直接访问)将被替换为新的。