3

我有一个 arrayList 并且我想使用 contains(Thing o) 方法来检查这两个对象的相等性,并且我覆盖了 Thing 类中的 equals() 方法但是当我调用 contains 方法时这不起作用!这是我的东西类:

public class Thing{

private int id;

//getter setter

@Override
public boolean equals(Object o) {
    if(!(o instanceof Thing))
        return false;
    if(id == ((Thing)o).getId())
        return true;
    return false;
}
}

是否也需要重写 hashCode() 方法?如果是,如何覆盖它?

4

3 回答 3

4

你应该覆盖hashCode. 该类ArrayList不使用该hashCode方法,因此现在没有必要但是如果您在任何时候将您的类与HashMap,HashSet或任何其他确实使用 的集合一起使用hashCode,程序将会中断,因为hashCode并且equals不一致

对于这种情况,hashCode 的简单实现可能是:

public int hashCode() {
    return id;
}
于 2013-08-17T08:41:45.590 回答
2

是的,只要你覆盖等于,就必须覆盖 hashCode() :

  • 如果您不覆盖 HashCode(),则“Object”类的默认行为是为每个对象提供唯一的 hashCode。

  • 这个唯一的 hashCode 将意味着两个不同的对象实例,除非
    您覆盖 hashCode() 以提供相同的值。

    public int hashCode(){ return this.id; }

当您使用 Eclipse 时,您不必手动编写。:) 在打开的 java 文件上右键单击 -->Source-->Generate HashCode() 和 equals()

于 2013-08-17T08:59:48.443 回答
1

如果您覆盖 equals(),您也应该始终覆盖 hashCode()。通过使用 Eclipse IDE,您可以简单地为您生成这些方法。菜单 -> 源 -> 生成 hashCode() 和 equals()

于 2013-08-17T08:47:52.600 回答