为什么下面的代码会给出java.lang.StackOverflowError错误
theoretical
内部执行的操作集是什么以及每次计算哈希码的原因是什么?
Set s = new HashSet();
s.add(s);
s.add(s);
答案 0 :(得分:2)
您可以通过
获得相同的异常Set s = new HashSet();
s.add(s);
s.hashCode();
原因是hashCode
的{{1}}被指定为元素Set
的总和(使用hashCode
表示null)。换句话说,0
相当于:
hashCode
在您的情况下,由于集合包含自身,因此对正文中public int hashCode() {
int result = 0;
for (Object o : this) {
result += (o == null ? 0 : o.hashCode()); // <== This line is the problem
}
return result;
}
的调用实际上是递归的,因此导致hashCode
。
至于为什么StackOverflowError
被调用,这就是hashCode
的工作方式。添加元素时,其HashSet
值用于确定将元素放入哪个存储桶。此过程意味着hashCode
具有非常快速且高效的HashSet
方法。
答案 1 :(得分:0)
你的Set每次都在计算哈希码,因为你使用HashSet实现来计算该组内每个对象的哈希值并使用该哈希来确保没有重复的元素。而且由于你正在为自己添加一些内容,它会在没有结束条件的情况下呈递归并填满堆栈 - &gt;堆栈溢出;)
答案 2 :(得分:0)
如果您使用 Lombok 和 Java。
@Getter 和 @Setter 而不是 @Data 。
因为@Data 注解包含@EqualsAndHashCode。
示例:
@Data
class Example {
}
@Getter
@Setter
class Example {
}