为什么 ArrayList 在插入数据后更改其哈希码?

Why the ArrayList change its hashcode after insert the data?

嗯,在我看来,对象的 hashCode() 可能与 C++ 中的对象地址相同,所以我希望对象的 hashCode 在插入数据前后保持不变。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Created by charlie on 2015/12/11.
 */
public class Hello {
    public static void main(String[] args) {
        List<Integer> a = new ArrayList<>(1024);
        a.add(0, 1);
        System.out.println(a.hashCode());
        a.add(1, 2);
        System.out.println(a.hashCode());
    }
}

但是好像输出了不同的值,也就是说插入一个值后,新的列表对象是原始值的深拷贝?

hashCode 不是对象的地址,而是对象内容的计算哈希值。参考javadoc获取更多信息

如果你想比较并检查它是否是同一个对象,那么你可以使用 == 运算符,它会检查引用。

根据 Javadocs ,列表的哈希码将根据其中的各个对象哈希码计算。所以每当你向List添加一个元素时,这将直接影响List的hashCode。

参考以下文档。要计算 hashCode,它会遍历每个元素


int hashCode()
Returns 此列表的哈希码值。列表的哈希码定义为以下计算的结果:

int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

这确保 list1.equals(list2) 意味着 list1.hashCode()==list2.hashCode() 对于任何两个列表,list1 和 list2,正如总合同所要求的Object.hashCode().

希望这对您有所帮助..

根据 java 文档,列表的 hashCode 受添加到列表中的元素的影响。所以列表中添加元素前后的hashCode值是不一样的

以下是 Java 用于计算列表 hashCode 的代码:

int hashCode = 1;
  for (E e : list)
      hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

这里E是列表中元素的类型(List<E>)

所以从上面的计算可以看出,hashCode生成也依赖于被添加到列表中的元素的hashCode

这就是您在向列表中添加另一个元素后得到 hashCode 不同值的原因。