equals()
(javadoc)必须定义等价关系(必须是reflexive、symmetric和transitive).此外,它必须是consistent(如果对象没有修改,则它必须始终返回相同的值).此外,o.equals(null)
必须始终返回false.
hashCode()
(javadoc)也必须是consistent(如果对象没有按照equals()
进行修改,它必须继续返回相同的值).
这两种方法之间的差异为:
Whenever 100, then 101 must be same as 102.
如果覆盖一个,那么应该覆盖另一个.
使用与计算equals()
到hashCode()
相同的字段集.
使用Apache Commons Lang库中的优秀助手类EqualsBuilder和HashCodeBuilder.举个例子:
public class Person {
private String name;
private int age;
// ...
@Override
public int hashCode() {
return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
// if deriving: appendSuper(super.hashCode()).
append(name).
append(age).
toHashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
if (obj == this)
return true;
Person rhs = (Person) obj;
return new EqualsBuilder().
// if deriving: appendSuper(super.equals(obj)).
append(name, rhs.name).
append(age, rhs.age).
isEquals();
}
}
当使用基于哈希的Collection或Map(例如HashSet、LinkedHashSet、HashMap、Hashtable或WeakHashMap)时,请确保放入集合中的关键对象的hashCode()在对象位于集合中时不会更改.确保这一点的防弹方法是使你的 keys 不可变,which has also other benefits.