public class Dog
{
int collarID;
String name;
public static void main(String[] args){
Dog d = new Dog();
d.name="hose";
System.out.print(d.hashCode());
}
public boolean equals(Object arg0)
{
if (arg0 instanceof Dog)
{
Dog new_name = (Dog) arg0;
return collarID==new_name.collarID && new_name.name.equals(name);
}
return false;
}
public int hashCode()
{
return toString().length();//StackOverflow
}
}
What am I missing? Is there a recurrent call to hashCode() method because of default toString() method?
If you see the source code of toString
method of Object
class, it looks like: -
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
So, it internally invokes hashCode()
method. Now, since you have overrided the hashCode
method, it will invoke the hashCode
method of your class, which agains invokes toString
method of Object
class.
This will certainly result in StackOverFlowError
You can rather override the toString
method in your class, to make it work.
P.S.: -
However, your hashCode
implementation should be designed, considering the attributes you have used in equals
method, to maintain the contract
between hashCode
and equals
method. Use only those attributes
in calculating hashCode
that you have used to compare your instances
in equals
method.
See these links for more details on hashCode
and equals
method:-