我需要覆盖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
场来关注这个问题。
ArrayList
(以及任何List
实现(需要正确覆盖equals
和hashCode
,如List
javadoc:中所述
布尔java.util.List.equals(Object o(
将指定的对象与此列表进行相等性比较。当且仅当指定的对象也是一个列表,两个列表的大小相同,并且两个列表中所有对应的元素对都相等时,返回true。(如果(e1==null?e2==null:e1。equals(e2((,则两个元素e1和e2相等。(换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。此定义确保equals方法在List接口的不同实现中正常工作。
int java.util.List.hashCode((
返回此列表的哈希代码值。列表的哈希代码被定义为以下计算的结果:
int hashCode=1
对于(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
。否则,必须添加一些附加检查。