据我了解,以下代码应打印HashCode
集合,因为我正在直接打印HashCode
。
但是,当我运行以下代码时,我收到Stack overflow
错误:
public class Test1 {
public static void main(final String[] args) {
m1(new LinkedHashSet<Collection<?>>());
}
private static void m1(final Collection<Collection<?>> cl) {
cl.add(cl);
try {
System.out.println(cl.hashCode());
} catch (Error err) {
System.out.println(err);
}
}
}
有人可以解释这种行为吗?
答案 0 :(得分:6)
您已创建一个Collection
,其中包含自身作为元素。
LinkedHashSet
hashCode()
是其元素的函数&#39; hashCode
s(如下所示),因此计算hashCode()
会导致无限递归。
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode(); // when obj == this, as in your case, this
// call leads to infinite recursion
}
return h;
}
答案 1 :(得分:4)