As per below paper
To consolidate the concept of equals() and hashCode(), we are saying for any custom objects like Tiger etc we have to override equals() method since we do not know if want to define equality based on color or stripes etc. Since we override equals() for custom objects we should definitely override hashCode() method also to avoid the corruption.
For String objects we should always use default parent class Object .equals() (as there are nothing like color, stripes etc) to compare strings not ==(which is mostly used for primitives)
For String objects hashCode() need not be implemented since .equals() we are not overriding.
I was reading more here
But String equals() and hashCode() is still not as clear as Custom Objects equals() hashCode()