将两个对象与hashsets进行比较的合适方法是什么?

时间:2011-09-04 15:30:01

标签: java hashset

我有一个人类,在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();
}

2 个答案:

答案 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,也许namefiends可以为空。

关于equalshashCode已经写了很多。最好的方法是查看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();
}