Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java - what happens if hashCode is not overriden? [duplicate]

Tags:

java

hashcode

Possible Duplicate:
what is an objects hashcode

Let's say that I create an object, called Employee which has id, firstName, lastName and email for instance variables and corresponding setter/getter methods. How is hashCode() calculated if I don't override hashCode() in Employee object when it is stored in collection objects?

like image 788
user826323 Avatar asked Jan 30 '13 16:01

user826323


2 Answers

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.

Some collections, like HashSet, HashMap or HashTable use the hash code to store its data and to retrieve it. If you don't implement hashcode() and equals() in a consistent manner, then they will not function properly.

Edit:

As per Javadoc: Object.hashcode() is ''typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java(TM) programming language''. Therefore I would advise not to rely on a specific implementation. For what the implementations really do, see this answer to a similar question.

like image 119
Cyrille Ka Avatar answered Oct 05 '22 18:10

Cyrille Ka


From the documentation:

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

So basically when you store in a Map/Set/somethingThatRequiresHashCode, the JVM will use the internal memory address of that instance to calculate the hashCode, guaranteeing (as much as hash functions guarantee anything - they don't) that each distinct instance will have a unique hashCode.

This is particularly important because of the Object contract regarding equals and hashCode, since:

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

If you don't override equals, it will compare the internal address of the two references, which matches the logic behind hashCode.

If your question is more related to: Will the JVM look at the values inside an instance to determine equality/calculate hashcode, the answer is simply no, if you do:

MyObject a = new MyObject("a", 123,"something");
MyObject b = new MyObject("a", 123,"something");

a and b will have different hashcodes.

like image 37
pcalcao Avatar answered Oct 05 '22 20:10

pcalcao