Prabhu
Prabhu

Reputation: 11

Java collections - overriding equals and 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());
  }
}

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?

Upvotes: 0

Views: 1398

Answers (3)

highlycaffeinated
highlycaffeinated

Reputation: 19867

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

Upvotes: 7

Howard
Howard

Reputation: 39197

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.

Upvotes: 0

BlueDog
BlueDog

Reputation: 976

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.

Upvotes: -3

Related Questions