java.lang.StackOverflowError 添加设置以设置自身

标签 java hashmap hashset

为什么下面的代码给出 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 每次都在计算哈希码,因为您使用 HashSet 实现计算该集合内每个对象的哈希值,并使用该哈希值来确保没有重复的元素。而且由于您正在向自身添加一些东西,因此它会在没有结束条件的情况下递归并填满堆栈 -> 堆栈溢出 ;)

关于java.lang.StackOverflowError 添加设置以设置自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49574286/

相关文章:

scala - Scala中 'HashSet'和 'Set'之间的区别?

c# - HashSet 枚举器有什么作用?

java - 在 Java 中使用正则表达式模式

java - 在 Quarkus 中使用 ResourceLoader

java - ORMLite - 如何创建对象并填充外部集合?

java - Struts2 在 JSP 中从 session 映射迭代

计算 c 中哈希集中的簇

java - TextView 类型未定义方法 getBytes()

java - hashmap 在调用 containsKey() 时检查什么?

java - 在 string[] 中存储排序后的 hashmap 的键值