-3

如果我想检查 MyClass 类的某个 Object 是否包含在 ArrayList 等中,我可以覆盖 equals。

public boolean equals(Object o) {
    .....
}

但是如果我想检查 MyClass 的对象是否包含在 HashMap 或 HashSet 中,我该怎么办?我猜 hashCode 必须被覆盖?这是正确的吗?我该怎么做?谢谢!编辑:我完全了解 contains/containsKey 等。但是为什么覆盖列表而不是集合的等于就足够了。如果我只是测试一个数组列表是否包含一个对象,则覆盖的方法可以正常工作。对于 Set 来说,这还不够。我的问题是我必须另外覆盖 io 才能做到这一点。我不想要额外的方法,我猜关键在于 hashCode。

4

4 回答 4

4

如果您在任何情况下覆盖 equals,则应始终覆盖 hashCode。

http://www.xyzws.com/javafaq/why-always-override-hashcode-if-overriding-equals/20

于 2013-05-20T16:54:53.767 回答
3

完全相同的。其实有两个部分

  • 覆盖equals你的班级,因为它是有意义的

  • 使用容器中检索对象的方法。当然,那个方法会使用equals对象的方法。

HashSet 有一个contains()方法和HashMap一个containsKey/ containsValue

于 2013-05-20T16:47:22.890 回答
2

您可以使用contains()方法检查 HashSet 是否包含对象。

您可以使用containsKey()方法检查 HashMap 是否包含作为键的对象。

对于任何一个,您都可以覆盖Object.equals()and Object.hashCode()。通常如果你覆盖一个,你也必须覆盖另一个,以满足他们的合同

于 2013-05-20T16:47:09.543 回答
2

是的,您必须在 MyClass 类中覆盖您的equals()方法。

这是一个例子:

public class MyClass {
    private String name;
    private String gender;

    public MyClass(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        MyClass other = (MyClass) obj;
        if (gender == null) {
            if (other.gender != null) return false;
        } else if (!gender.equals(other.gender)) return false;
        if (name == null) {
            if (other.name != null) return false;
        } else if (!name.equals(other.name)) return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((gender == null) ? 0 : gender.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

请注意,当您重写equals () 方法时,重写hashcode ()是一种很好的编程习惯,特别是在哈希概念出现的场景中。例如HashMap 。

然后,您可以进行如下比较:

public class Test {
    public static void main(String args[]) throws Exception {
        MyClass myFirstClass = new MyClass("John", "Male");
        MyClass mySecondClass = new MyClass("Jessica", "Female");
        Set<MyClass> mySet = new HashSet<MyClass> ();

        mySet.add(myFirstClass);
        mySet.add(mySecondClass);

        MyClass myDupeClass = new MyClass("Jessica", "Female");

        for (MyClass someClass: mySet) {
            if (someClass.equals(myDupeClass)) {
                System.out.println("Match found for: " + someClass.getName());
            }
        }
    }
}

输出符合预期

Match found for: Jessica
于 2013-05-20T17:00:21.973 回答