java - 使用聚合 Arraylist 覆盖类中的 equals 方法
问题描述
我需要覆盖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中所述:
boolean 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;
for (E e : list) {hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());}
因此,您只需要调用list.equals()
and即可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
。否则,必须添加一些额外的检查。
推荐阅读
- php - Laravel 7:foreach 循环中未定义的变量
- mongodb - MongoDB Golang 驱动程序尝试连接到 localhost 而不是 docker 主机
- .net - Windows 窗体应用程序设置任务计划程序以运行一些已包含在此应用程序中的类的更好方法是什么?(。网)
- javascript - Googlemaps按类名放置自动完成 - JS循环问题
- visual-studio - Visual Studio 可以为解决方案生成创建报告吗?
- javascript - 打字稿 - 有没有办法从类型定义创建一个实例
- c - Windows/Visual Studio 在完美的 C 程序上变得不稳定
- java - 完美工作的 Eclipse 项目在 Tomcat 上抛出 404
- docker - 在 Kubernetes 中使用多播的 ActiveMQ 代理网络
- ios - 从 Apple Review 中解读符号化的崩溃日志