我在下面创建了
Person
:
public class Person {
private String sCode;
private String sDate;
Person(String sCode, String sDate) {
this.sCode = sCode;
this.sDate = sDate;
}// Constructor and other methods...
@Override
boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person oPerson = (Person) obj;
return oPerson.sCode == this.sCode && oPerson.sDate == this.sDate;
}
@Override
public int hashCode() {
return Objects.hash(this.sCode, this.sDate);
}
}
我想将
Person
对象存储在 HashSet
(personSet) 中:
HashSet<Person> personSet = new HashSet<>();
Person person1 = new Person("Aman", "2021-01-01");
Person person2 = new Person("Aman", "2021-01-01");
personSet.add(person1);
personSet.add(person2);
System.out.println(personSet.size()); //Expected size to be "1"
但是我遇到了错误
Caught: java.lang.StackOverflowError
,如下:
Caught: java.lang.StackOverflowError
java.lang.StackOverflowError
at Person.equals(Person.groovy:12)
有人可以建议我为什么我的代码会抛出此错误吗?
在 Groovy 中,
==
调用 .equals
。 因此,if (this == obj) return true
行创建了无限循环,导致堆栈溢出异常。如果
您想知道两个参考是否相同,请使用 .is
,例如if (this.is(obj)) return true
。
也就是说,几乎没有理由编写自己的“等于和” 哈希码”(或者更糟糕的是,让你的 IDE 生成它们)与 Groovy。有
EqualsAndHashCode
,
只需一行代码即可完成您所需要的操作,并且很可能会执行此操作
它的最好版本。