当前位置: 首页 > 知识库问答 >
问题:

具有列表的类上的lombok EqualsAndHashCode

方浩旷
2023-03-14
@EqualsAndHashcode
MyClass {
String property1;
List<NewClass> newClassList;
}

@EqualsAndHashcode
NewClass {
String abc;
String xyz;
}

如果我比较MyClass的两个对象(用@EqualsAndHashcode注释)是否相等,是否会检查newClassList属性的顺序?

共有2个答案

董哲
2023-03-14

这取决于你想要什么类型的比较。比较[1,1,2]==[1,2,2]应该返回true吗?如果是,那么您可以将列表转换为set(也许您也应该在类中使用Set):

public boolean equals(Object o) {
  if (this == o) return true;
  if (o == null || getClass() != o.getClass()) return false;
  MyClass that = (MyClass) o;
  if (this.newClassList == null && that. newClassList == null) return true;
  if (this.newClassList != null && that.newClassList != null
      && this.newClassList.size() == that.newClassList.size()) {
    return new HashSet(this.newClassList).equals(new HashSet(that.newClassList));
  }
  return false;
}

否则,您必须对列表中的元素进行排序并进行比较:

public boolean equals(Object o) {
    // same code as before, except the HashSet part
    List<NewClass> one = new ArrayList<NewClass>(this.newClassList); 
    List<NewClass> two = new ArrayList<NewClass>(that.newClassList);   
    Collections.sort(one);
    Collections.sort(two);      
    return one.equals(two);

另外,您必须为NewClass定义自己的比较器,以便排序方法知道如何对元素进行排序。

敖永丰
2023-03-14

通过使用@EqualsAndHashcode它将传播为使用根据java文档的新ClassList.equals(..)方法

接口列表

boolean equals(Object o)将指定的对象与此列表进行比较,以确定是否相等。当且仅当指定对象也是一个列表,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等时,返回true。(两个元素e1和e2相等,如果(e1==null?e2==null : e1.equals(e2))。)换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。这个定义确保equals方法在List接口的不同实现中都能正常工作。

如果你想要一个自定义功能,其中list不检查顺序,那么你必须删除@EqualsAndHashcode并根据你想要的提供你自己的等价方法。

您想要的功能将以一种简单的方式

(list1 != null && list2 != null && list1.size() == list2.size() && list1.containsAll(list2) && list2.containsAll(list1) ) || (list1 == null && list2 == null)

这将引导我们使用下面的equals方法

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NewClass newClass = (NewClass) o;
        return Objects.equals(property1, newClass.property1) &&
                ((newClassList != null && newClass.newClassList != null && newClassList.size() == newClass.newClassList.size() && newClassList.containsAll(newClass.newClassList) && newClass.newClassList.containsAll(newClassList) ) || (newClassList == null && list2 == null));
               
    }

不要忘记手动覆盖< code>hashcode方法。

 类似资料:
  • 问题内容: 我遇到一个问题,其中Hibernate(4.1.8.FINAL)返回带有NULL值的列表(单向OneToMany映射)。 我得到的是: 我得到一个大小为21的列表,其中EntryAddress在第10个索引上,而2nd Entry Address在第20个索引上。 我所期望的 -我期望一个只有两个EntryAddress对象的List: 这是最小的源代码: 这是mysql结构(Inno

  • 如果我有这样的方法: 为什么要编译这个代码?为什么超级字符串与T兼容扩展了CharSequence

  • 问题内容: 我为缓存编写了一个函数来检索特定对象。这样我就不需要投了。 我正在这样使用 但是现在我的缓存中有一个字符串列表,我不能这样使用 问题是。我对Java非常陌生,我该怎么写? 问题答案: 您无法获得的类,在您的情况下,唯一的方法是:

  • 在私有类中创建一个全局List并具有getter和setter方法会更好,还是只公开它会更好?Java的标准是什么? 我被教导将变量设为私有,只有getter和setter方法,但是访问公共列表肯定比私有列表更好。 这是我的观点,但我当然更喜欢按照标准去做,而不是按照看起来好的去做。

  • 问题内容: 我想学习如何从MS SQL数据库中获取具有标识列的所有表的列表。 问题答案:

  • 问题内容: 我有一个班级用户。用户可以与许多其他用户成为朋友。这种关系是相互的。如果A是B的朋友,那么B是A的朋友。我也希望每个关系都存储其他数据,例如两个用户成为朋友的日期。因此,这是同一表上具有多列的多对多关系。我知道应该创建一个中产阶级友谊(包含两个用户ID和日期列)。但是我在将其与Hibernate映射时做得不够。使我停滞不前的是映射到了同一张表。如果多对多关系是在两个不同的表之间,则可以