使用聚合Arraylist覆盖类中的equals方法

时间:2018-08-01 09:54:28

标签: java arraylist equals aggregation hashcode

我需要重写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字段中的这个问题。

1 个答案:

答案 0 :(得分:1)

ArrayList javadoc中所述,

List(以及任何equals实现)需要正确地覆盖hashCodeList

  

布尔型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。否则,必须添加一些其他检查。