Java集合-重写equals和hashCode 公共类Eq{ 公共静态void main(字符串…r){ HashMap=newHashMap(); 散列j=新散列(2); map.put(j,1); map.put(j,2); System.out.println(map.size()); } }
产量为Java集合-重写equals和hashCode 公共类Eq{ 公共静态void main(字符串…r){ HashMap=newHashMap(); 散列j=新散列(2); map.put(j,1); map.put(j,2); System.out.println(map.size()); } },java,collections,equals,hashcode,Java,Collections,Equals,Hashcode,产量为 public class Eq { public static void main(String...r) { HashMap<Hash,Integer> map=new HashMap<Hash,Integer>(); Hash j=new Hash(2); map.put(j,1); map.put(j,2); System.out.println(map.size()); } }
public class Eq {
public static void main(String...r) {
HashMap<Hash,Integer> map=new HashMap<Hash,Integer>();
Hash j=new Hash(2);
map.put(j,1);
map.put(j,2);
System.out.println(map.size());
}
}
内部散列
内部散列
1.
由于它返回相同的hashcode,第二次在hashmap中添加对象时,它必须使用equals方法,但它不调用。那么这里的问题是什么呢?
put():将指定值与此映射中的指定键相关联如果映射以前包含此键的映射,则替换旧值。
put():将指定值与此映射中的指定键相关联如果映射以前包含此键的映射,则替换旧值。
HashMap
在.equals
之前使用=
进行测试,由于您放置同一对象两次,因此第一次测试通过。尝试:
inside hash
inside hash
1
HashMap
在.equals
之前使用=
进行测试,由于您放置同一对象两次,因此第一次测试通过。尝试:
inside hash
inside hash
1
相等性检查由HashMap通过三个步骤完成:
第二步阻止调用
equals
,因为相同的对象总是假定相等。相等检查由HashMap分三步完成:
第二步防止调用
equals
,因为相同的对象总是假定相等。第393行第393行的“指定键”是哈希码,不是吗?由于在第二次put时已使用该键,因此不需要检查是否相等,因此不需要调用equals()。还是我弄糟了?正确答案是第一个-有一个指向hashmap代码的链接。hashmap通过创建一个包含所有具有特定hashcode的项的内部列表来支持键冲突。在put中,它使用相同的哈希代码搜索所有项,并使用==| |.等于来进行最终确定。所以在最初的问题中,它命中了hashCode,但是==comaprison正在成功并短路了对.equals的调用。“指定键”就是hashCode,不是吗?由于在第二次put时已使用该键,因此不需要检查是否相等,因此不需要调用equals()。还是我弄糟了?正确答案是第一个-有一个指向hashmap代码的链接。hashmap通过创建一个包含所有具有特定hashcode的项的内部列表来支持键冲突。在put中,它使用相同的哈希代码搜索所有项,并使用==| |.等于来进行最终确定。所以在最初的问题中,它命中了hashCode,但是==comaprison成功了,并且短路了对.equals的调用。
Hash j=new Hash(2);
Hash k=new Hash(2);
map.put(j,1);
map.put(k,2);