Java 两个列表在equals()函数下相等,但哈希代码不同?
我有两个ArrayList,它们在equals方法下相等,但它们有不同的哈希代码。这是怎么回事 根据Java列表API:list1.equalList2意味着list1.hashCode==list2.hashCode,适用于任意两个列表list1和list2,这是Object.hashCode的通用合同所要求的 代码如下: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)
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函数。谢谢大家!!编辑文章,以提供更具描述性的答案