我有一个人类,在HashSet中有一个名字和一个朋友列表。
我想覆盖此Person类的equals
方法。以下是我到目前为止所写的内容。
但是我不确定这个,因为我知道HashSet不一定要整齐,我也听说我必须覆盖HashCode方法。
我应该在下面的代码中进行哪些修改才能正确实现equals方法?
public boolean equals(Note target){
if(this.name==target.getName() && this.friends == target.getFriends()){
return true;
}
return false;
}
public HashSet<Person> getFriends(){
return this.friends;
}
修改
//override hashCode()
public int hashCode() {
return name.hashCode() + friends.hashCode();
}
答案 0 :(得分:2)
==
和HashSet
name
运算符绝对是错误的。如果要比较java中的对象,请使用equals方法。 ==
运算符比较JVM管理的内部对象ID。 HashSet
equals
方法的合同是AbstractSet.equals()
中的文档。
@Override
public boolean equals(Object o){
if (o instanceof Note) {
Note target = (Note) o;
if(this.name.equals(target.getName()) && this.friends.equals(target.getFriends())){
return true;
}
}
return false;
}
您也可以查看null
,也许name
和fiends
可以为空。
关于equals
和hashCode
已经写了很多。最好的方法是查看lava.lang.Object.equals()
的JavaDoc。
答案 1 :(得分:1)
您目前设置equals(Note)
方法的方式,它(几乎)永远不会返回true
。使用String
个对象时,您应始终使用equals(String)
,而不是==
。
我会创建这样的Note.equals(Note)
方法:
@Override
public boolean equals(Object obj){
if(obj instanceof Note) {
Note target = (Note) obj;
if(name.equals(target.name) && friends.containsAll(target.friends)
&& friends.size() == target.friends.size()){
return true;
}
}
return false;
}
您会注意到我上面提供的equals(Note)
方法也没有friends.equals(target.getFriends())
。这是因为您要比较包含的HashSet
,而不是HashSet
的内容。
最后,如果您希望Note
类正确散列,则还需要覆盖hashCode()
方法。您可以在hashCode()
文档中的Object
方法说明中详细了解此合同。
public int hashCode() {
return name.hashCode() + friends.hashCode();
}