检查HashSet / HashMap是否包含Object

时间:2013-05-20 16:44:34

标签: java hash hashmap hashset

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

完全一样。实际上,有两个部分

  • 在课程中覆盖equals,因为它有意义

  • 在检索对象的容器中使用该方法。当然,该方法将使用对象的equals方法。

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

答案 2 :(得分:2)

您可以检查HashSet是否包含具有contains()方法的对象。

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

对于其中一种,您可以覆盖Object.equals()Object.hashCode()。通常,如果您覆盖一个,则还必须覆盖另一个,以满足其contracts

答案 3 :(得分: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;
    }
}

请注意,当您覆盖等于()方法时,优先覆盖哈希码()是一种很好的编程习惯,特别是在哈希概念出现的情况下到图片中。例如,像 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