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通过三个步骤完成:

  • 哈希代码不同=>不相等
  • 对象相同(==)=>相等
  • equal方法给出true=>equal

  • 第二步阻止调用
    equals
    ,因为相同的对象总是假定相等。

    相等检查由HashMap分三步完成:

  • 哈希代码不同=>不相等
  • 对象相同(==)=>相等
  • equal方法给出true=>equal

  • 第二步防止调用
    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);