Java collections - overriding equals and hashCode

2019-09-01 03:17发布

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

output was

inside hash

inside hash
1

Since it returns the same hashcode , the second time an object is added in hashmap it must use the equals method but it doesnt call . So wats the problem here?

3条回答
欢心
2楼-- · 2019-09-01 03:30

From the doc

put(): Associates the specified value with the specified key in this map. If the map previously contained a mapping for this key, the old value is replaced.

查看更多
爷的心禁止访问
3楼-- · 2019-09-01 03:34

The HashMap is testing with == before .equals, and since you are putting the same object twice, the first test passes. Try with:

    Hash j=new Hash(2);
    Hash k=new Hash(2);
    map.put(j,1);
    map.put(k,2);
查看更多
放我归山
4楼-- · 2019-09-01 03:37

The equality check is done by HashMap in three steps:

  1. hash code is different => unequal
  2. objects are identical (==) => equal
  3. equal method gives true => equal

The second step prevents calling equals since identical objects are always assumed equal.

查看更多
登录 后发表回答