@EqualsAndHashcode
MyClass {
String property1;
List<NewClass> newClassList;
}
@EqualsAndHashcode
NewClass {
String abc;
String xyz;
}
如果我比较MyClass的两个对象(用@EqualsAndHashcode注释)是否相等,是否会检查newClassList属性的顺序?
这取决于你想要什么类型的比较。比较[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
定义自己的比较器,以便排序
方法知道如何对元素进行排序。
通过使用@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映射时做得不够。使我停滞不前的是映射到了同一张表。如果多对多关系是在两个不同的表之间,则可以