Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个列表在equals()函数下相等,但哈希代码不同?_Java_Hashcode_Hash Code Uniqueness - Fatal编程技术网

Java 两个列表在equals()函数下相等,但哈希代码不同?

Java 两个列表在equals()函数下相等,但哈希代码不同?,java,hashcode,hash-code-uniqueness,Java,Hashcode,Hash Code Uniqueness,我有两个ArrayList,它们在equals方法下相等,但它们有不同的哈希代码。这是怎么回事 根据Java列表API:list1.equalList2意味着list1.hashCode==list2.hashCode,适用于任意两个列表list1和list2,这是Object.hashCode的通用合同所要求的 代码如下: List<nut> l1= new ArrayList<>(Arrays.asList(new nut((short) 4, (short)

我有两个ArrayList,它们在equals方法下相等,但它们有不同的哈希代码。这是怎么回事

根据Java列表API:list1.equalList2意味着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

检查AbstractList ArrayList的equals和hashcode的实现是否扩展了该类

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类时,处理此问题的责任就落在您身上


答案是:您搞乱了nut类中hashcode和equals之间的契约。

请将您的问题包含在nut类的源代码中。很可能您没有按照要求重写hashcode方法。如何为您的nut类定义equals和hashcode以及构造函数?我假设问题就在那里。ArrayList将equals和hashCode实现为列表中元素的相应方法的聚合,因此如果它们是错误的,那是因为元素做得不对。nut类的hashCode实现违反了bullet 2:如果两个对象根据equalsObject方法相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。啊,我明白了。我需要重写nut类中的hashcode函数。谢谢大家!!编辑文章,以提供更具描述性的答案