-1

我有两个在 equals() 方法下相等的 ArrayList,但它们具有不同的哈希码。这里发生了什么?

根据 Java List API:“list1.equals(list2) 意味着 list1.hashCode()==list2.hashCode() 用于任何两个列表 list1 和 list2,这是 Object.hashCode() 的一般合同所要求的。 "

这是代码:

    List<nut> l1= new ArrayList<>(Arrays.asList(new nut((short) 4, (short) 2),
        new nut((short) 5, (short) 0), new nut((short) 1, (short) 3)));
    List<nut> l2= new ArrayList<>(Arrays.asList(new nut((short) 4, (short) 2),
        new nut((short) 5, (short) 0), new nut((short) 1, (short) 3)));
    System.out.println(l1.equals(l2));
    System.out.println(l1.hashCode());
    System.out.println(l2.hashCode());

输出:真-2130368428 1856372392

4

1 回答 1

2

检查equals()hashcode()的实现AbstractListArrayList正在扩展该类)

public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof List))
            return false;

        ListIterator<E> e1 = listIterator();
        ListIterator<?> e2 = ((List<?>) o).listIterator();
        while (e1.hasNext() && e2.hasNext()) {
            E o1 = e1.next();
            Object o2 = e2.next();
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;
        }
        return !(e1.hasNext() || e2.hasNext());
}

public int hashCode() {
        int hashCode = 1;
        for (E e : this)
            hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
        return hashCode;
}

它遍历列表中的对象并在它们上调用equals()/ hashcode()nut因此,当您以泛型类型提供类时,处理此问题的责任就落在了您身上。

答案是:你搞砸了班级之间hashcode()和班级equals()中的合同nut

于 2021-03-14T20:45:53.100 回答