我需要重写Java类中的equals()
和hashCode()
方法。但是此类包含对象列表。我应该如何通过比较ArrayList
字段来实现部分代码?
代码如下:
public class FirstClass {
private List<SecondClass> list = new ArrayList<>();
equals() {
//how i should implement equals for list field?
}
hashCode() {
}
}
我只能补充说,SecondClass
具有运作良好的equals
和hashCode
方法。
我了解对称,过渡和其他重要事项,但是我只想关注ArrayList
字段中的这个问题。
答案 0 :(得分:1)
ArrayList
javadoc中所述, List
(以及任何equals
实现)需要正确地覆盖hashCode
和List
:
布尔型java.util.List.equals(对象o)
将指定的对象与此列表进行比较以确保相等。当且仅当指定对象也是一个列表,并且两个列表具有相同的大小,并且两个列表中所有对应的元素对相等时,才返回true。 (如果(e1 == null?e2 == null:e1.equals(e2)),则两个元素e1和e2相等。)换句话说,如果两个列表包含相同顺序的相同元素,则两个列表定义为相等。 。此定义可确保equals方法可在List接口的不同实现中正常工作。
int java.util.List.hashCode()
返回此列表的哈希码值。列表的哈希码定义为以下计算的结果:
int hashCode = 1;
for(E e:list){hashCode = 31 * hashCode +(e == null?0:e.hashCode());}
因此,您所需要做的就是调用list.equals()
和list.hashCode()
。
public class FirstClass
{
private List<SecondClass> list = new ArrayList<>();
@Override
public boolean equals(Object other) {
if (this == other)
return true;
if (!(other instanceof FirstClass))
return false;
FirstClass fc = (FirstClass) other;
return list.equals(fc.list);
}
@Override
public int hashCode() {
return list.hashCode ();
}
}
这是假设list
永远不会是null
。否则,必须添加一些其他检查。