java.lang.StackOverflowError添加set来设置它自己

时间:2018-03-30 12:17:46

标签: java hashmap hashset

为什么下面的代码会给出java.lang.StackOverflowError错误

theoretical

内部执行的操作集是什么以及每次计算哈希码的原因是什么?

Set s = new HashSet();
s.add(s);
s.add(s);

3 个答案:

答案 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 {

}