设计重写equals()和hashCode()
2016-07-01 本文已影响177人
冯奕欢
我们一般不会动这两个方法,但是如果我们达到某种需求,如object1.equals(object2)为true,那你必须得重写这两个方法。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
怎么重写,我们先定义一个类:
class ObjectM {
int id;
String name;
}
那我们先重写equals(),很简单:
boolean equals(Object o) {
if(o == null) {
return false;
}
if (o == this) {
return true;
}
if (getClass() != o.getClass()) {
return false;
}
ObjectM m = (ObjectM) o;
return (this.id == m.id);
}
光是写equals()方法还不行,我们还得重写hashCode()方法,我们先看看hashCode()方法:
hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + getId();
return result;
}
注意事项:
尽量保证使用对象的同一个属性来生成hashCode()和equals()两个方法。在我们的案例中,我们使用id。
eqauls方法必须保证一致(如果对象没有被修改,equals应该返回相同的值)
任何时候只要a.equals(b),那么a.hashCode()必须和b.hashCode()相等。
两者必须同时重写。