Method equals check if two objects are equal.
String class and most collection classes overrides equal to check if two objects are meaningfully equal, which means, if two different string objects have the same value.
The equals method for class Object will return true, for any non-null reference values x and y, if x and y refer to the same object.
Method hashCode returns a hash code value for the object.
This method is supported for the benefit of hash tables such as those provided by HashMap.
The hashCode method is usually used along with equals.
For more details on hashing, you can refer to http://javajee.com/hashing-basics.
The hashCode method has a general contract as given below:
Whenever hashCode method is invoked on the same object more than once during one execution of a Java application, it should return the same integer, provided no information used in equals comparisons on the object is modified.
If two objects are equal according to the equals(Object) method, then the hashCode should also be same, as returned by the hashCode method for the two objects.
If two objects are unequal according to the equals(java.lang.Object) method, then the hashCode may or may not differ. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.
Equals need to be overriden if we want to compare if two objects are meaningfully same. For example, we can check if two different string objects have the same value.
According to the contract of hashCode, if two objects are equal, then their hashCode should also be same. So it is a good practice to override hashCode whenever we override equals.
Default implementation of hashCode() method in Object class uses the internal reference of the object and converts it into integer and returns it. When we override equals() and change the meaning of equality for an object then the same should be reflected by overriding the hashCode method. Or two equal objects according to equals() might have a different hashCode value, which is against the contract.
Hash code is primarily used in has based collections such as Hashtable, HashMap, HashSet etc.