为什么this.hashcode()正在生成stackoverflower错误

时间:2018-06-08 11:03:45

标签: java

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 谢谢

3 个答案:

答案 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内存不足(每次调用一个方法时,它会占用一个在方法返回之前一点点内存。