为什么 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
不同值的原因。
嗯,在我看来,对象的 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
不同值的原因。