Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why should I override hashCode() when I override equals() method?

Ok, I have heard from many places and sources that whenever I override the equals() method, I need to override the hashCode() method as well. But consider the following piece of code

package test;  public class MyCustomObject {      int intVal1;     int intVal2;      public MyCustomObject(int val1, int val2){         intVal1 = val1;         intVal2 = val2;     }      public boolean equals(Object obj){         return (((MyCustomObject)obj).intVal1 == this.intVal1) &&                  (((MyCustomObject)obj).intVal2 == this.intVal2);     }      public static void main(String a[]){         MyCustomObject m1 = new MyCustomObject(3,5);         MyCustomObject m2 = new MyCustomObject(3,5);         MyCustomObject m3 = new MyCustomObject(4,5);          System.out.println(m1.equals(m2));         System.out.println(m1.equals(m3));     } } 

Here the output is true, false exactly the way I want it to be and I dont care of overriding the hashCode() method at all. This means that hashCode() overriding is an option rather being a mandatory one as everyone says.

I want a second confirmation.

like image 607
bragboy Avatar asked Apr 25 '10 07:04

bragboy


People also ask

Why do we override hashCode and equals method?

Case 1: Overriding both equals(Object) and hashCode() method Whenever it(hashcode) is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.

What happens if we do not override hashCode () and equals ()?

If you don't override hashcode() then the default implementation in Object class will be used by collections. This implementation gives different values for different objects, even if they are equal according to the equals() method.

Is the following statement true always override hashCode when you override equals?

hashCode() doesn't have to be overridden if equals() is. equals() doesn't have to be overridden if hashCode() is. hashCode() can always return the same value, regardless of the object that invoked it. equals() can be true even if it's comparing different objects.


2 Answers

It works for you because your code does not use any functionality (HashMap, HashTable) which needs the hashCode() API.

However, you don't know whether your class (presumably not written as a one-off) will be later called in a code that does indeed use its objects as hash key, in which case things will be affected.

As per the documentation for Object class:

The general contract of hashCode is:

  • Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.

  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

like image 90
DVK Avatar answered Sep 18 '22 13:09

DVK


Because HashMap/Hashtable will lookup object by hashCode() first.

If they are not the same, hashmap will assert object are not the same and return not exists in the map.

like image 32
Dennis C Avatar answered Sep 19 '22 13:09

Dennis C