【发布时间】:2018-09-09 11:41:06
【问题描述】:
为什么下面的代码给出 java.lang.StackOverflowError 错误
Set s = new HashSet();
s.add(s);
s.add(s);
操作集在内部执行什么操作,为什么每次都计算哈希码?
Exception in thread "main" java.lang.StackOverflowError
at java.util.HashMap$KeyIterator.<init>(HashMap.java:1459)
at java.util.HashMap$KeySet.iterator(HashMap.java:916)
at java.util.HashSet.iterator(HashSet.java:172)
at java.util.AbstractSet.hashCode(AbstractSet.java:122)
at java.util.AbstractSet.hashCode(AbstractSet.java:126)
at java.util.AbstractSet.hashCode(AbstractSet.java:126)
at java.util.AbstractSet.hashCode(AbstractSet.java:126)
at java.util.AbstractSet.hashCode(AbstractSet.java:126)
【问题讨论】:
-
您在其中添加了 Set 实例,因此它在没有任何退出条件的情况下递归调用其方法。
-
为什么要给自己加Set,请解释一下?
-
@Prabhav,不幸的是我在添加确认时遇到了这个错误。
-
但我不认为,我们需要在现实生活中为自身添加集合。
-
是的,完全正确.. 通过查看 HashSet 的实现,为什么它每次都调用哈希码,即使我们自己添加了一个元素来找到正确的存储桶.. 理解以下来自 Paul Boddington 的答案。跨度>