Java集合 - 覆盖equals和hashCode

时间:2011-07-10 13:38:13

标签: java collections equals hashcode

class Hash {
  int a;

  Hash(int h){
    a=h;
  }

  public boolean equals(Object o) {     
    Boolean h=super.equals(o);
    System.out.println("Inside equals ");
    return h;
  }

  public int hashCode() {    
    System.out.println("Inside Hash");    
    return 2;
  }    
}

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());
  }
}

输出

inside hash

inside hash
1

由于它返回相同的哈希码,第二次在hashmap中添加一个对象时,它必须使用equals方法,但它不会调用。那么问这个问题呢?

3 个答案:

答案 0 :(得分:7)

HashMap正在==之前使用.equals进行测试,并且由于您将相同的对象放置两次,因此第一次测试通过。试试:

    Hash j=new Hash(2);
    Hash k=new Hash(2);
    map.put(j,1);
    map.put(k,2);

答案 1 :(得分:0)

HashMap通过三个步骤完成相等性检查:

  1. 哈希码不同=&gt;不相等的
  2. 对象相同(==)=&gt;等于
  3. 等于方法给出true =&gt;等于
  4. 第二步阻止调用equals,因为始终假定相同的对象相等。

答案 2 :(得分:-3)

From the doc

  

put():将指定的值与此地图中的指定键相关联。 如果地图之前包含此键的映射,则会替换旧值。