0
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?

2

3 Answers 3

7

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);
Sign up to request clarification or add additional context in comments.

1 Comment

Relevant code at line 393
0

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.

Comments

-3

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 Comments

The "specified key" is the hashcode, isn't it? Since the key is already used at the time of the second put, there is no need to check for equality hence no equals() call. Or did I mess it up?
The correct answer is the first one - there is a link to the hashmap code.
HashMap supports key collisions by creating an internal list containing all items with a specific hashcode. On a put, it searches all items with the same hashcode and uses == || .equals to make the final determination. so in the original question, it's hitting the hashCode, but the == comaprison is succeeding and short-circuitng the call to .equals.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.