public class Employee {
int id;
String value;
@Override
public boolean equals(Object obj) {
return true; }
@Override
public int hashCode() {
System.out.println("hi this is my hashcode " + this.hashCode());
return this.hashCode();}
}
public class TestCH {
public static void main(String args[])
{
Employee emp1= new Employee();
Employee emp2= new Employee();
Employee emp3= new Employee();
Employee emp4= new Employee();
Map map= new HashMap();
map.put( emp1,1);
map.put(emp2,2);
map.put(emp3,3);
System.out.println("with map "+map.size());
}
}
在这段代码中我试图通过System.out.println打印hashcode生成StackOverflowError。为什么我得到StackOverflowError 谢谢
答案 0 :(得分:12)
在您的代码中,this.hashCode()
会在没有任何终止条件的情况下致电itself
。这意味着它进入recursion
而没有任何termination
条件。我相信您正在尝试使用super.hashCode()
。您的代码应该是:
@Override
public int hashCode() {
System.out.println("hi this is my hashcode " + super.hashCode());
return super.hashCode();
}
答案 1 :(得分:3)
您正在反复调用对象的hashcode
方法,直到堆栈溢出。该方法一直在调用自己,直到它无法再跟踪它自己调用的时间,从而导致溢出错误。
改为,
public int hashCode() {
return this.value.hashCode();
}
答案 2 :(得分:2)
在你的hashCode方法中你执行:this.hashCode()
,导致递归只在堆栈已满时结束。因此,计算一个值并打印该值。
当你调用hashCode()时,该调用调用hashCode(),然后该调用调用hashCode()等等,直到Java内存不足(每次调用一个方法时,它会占用一个在方法返回之前一点点内存。