我有一个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()方法?如果是,如何覆盖它?
答案 0 :(得分:4)
您应该覆盖hashCode
。 ArrayList
类不使用hashCode
方法,因此现在不需要 ,但如果您在任何时候使用HashMap
类, HashSet
或使用hashCode
的任何其他集合,该程序将因hashCode
and equals
are not consistent而中断。
这种情况的hashCode的简单实现可能是:
public int hashCode() {
return id;
}
答案 1 :(得分:2)
是的,每当你重写equals:
时,必须覆盖hashCode()如果你没有覆盖HashCode(),则默认行为来自 “Object”类是为每个对象提供一个唯一的hashCode。
这个唯一的hashCode意味着两个不同的对象实例,除非是 你覆盖hashCode()来给出相同的值。
public int hashCode(){ 返回this.id; }
当你使用Eclipse时,你不必手动编写它。:) 打开java文件的RightCLick - > Source - >生成HashCode()和equals()
答案 2 :(得分:1)
如果你重写equals(),你也应该总是覆盖hashCode()。通过使用Eclipse IDE,您只需为您生成该方法。菜单 - >来源 - >生成hashCode()和equals()