首页 > 解决方案 > 使用聚合 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有很好的工作equalshashCode方法。我知道对称、过渡和其他重要的事情,但我只想关注这个ArrayList领域的问题。

标签: javaarraylistequalsaggregationhashcode

解决方案


ArrayList(和任何List实现)需要覆盖equalshashCode正确,如Listjavadoc中所述:

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。否则,必须添加一些额外的检查。


推荐阅读