如何查找集合的哈希码?

时间:2017-07-06 05:39:25

标签: java

据我了解,以下代码应打印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);
        }
    }

}

有人可以解释这种行为吗?

2 个答案:

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

这是由这一行引起的:

cl.add(cl);

您正在将该集合添加到自身。由于集合的哈希码基于集合中包含的元素,因此hashCode() cl方法将以递归方式调用。

来自enter image description here javadoc(强调我的):

  

返回此set的哈希码值。 集合的哈希码是   定义为集合中元素的哈希码的总和,   其中null元素的哈希码被定义为零。这个   确保s1.equals(s2)暗示s1.hashCode()==s2.hashCode()   对于任何两组s1s2,根据总合同的要求   Object.hashCode()