我有一些代码尝试使用 HashSet.retainAll()
函数。
在下面的示例代码中,HashSet
包含接口(interface) IPerson
,但对象 Person
中的 equals 函数永远不会到达。我什至尝试在界面中公开 equals 函数和其他一些东西。我觉得我已经尝试了一切。如何让 retainAll()
使用我实现的 equal 函数?
class Person implements IPerson {
private String name;
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Object obj){
System.out.println("calling equals");
return super.equals(Object obj);
}
}
HashSet<IPerson> persons1 = new HashSet<IPerson>();
persons1.add(new Person("Jane"));
persons1.add(new Person("Joel"));
persons1.add(new Person("Joe"));
HashSet<IPerson> persons2 = new HashSet<IPerson>();
persons2.add(new Person("Jane"));
persons2.add(new Person("Joel"));
persons1.retainAll(persons2);
// expect sysout from Person.equals()
System.out.println(persons1.size());
// prints 0
最佳答案
您需要考虑name
来检查相等性
并将其包含在计算hashCode
中,同时确保您遵循hashcode
and equals
contract
关于java - HashSet的retainAll使用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374127/