标签:hashcode hash stackoverflow问题精选 equals
问题
重写(Override)equlas和hashCode方法时应考虑哪些问题?
精华回答
理论上讲(偏程序语言和数学层面)
equals() 定义了对象的相等关系(自反性、对称性、传递性)(有点抽象,更详细说明,请参考
javadoc) 。
另外,它还具有一致性(也就是说,如果一个对象没有修改,那么这个方法应总是返回相同的值),此外,o.equals(null)应当总是返回false。
hashCode()(
javadoc)也必须是一致性的(也就是说,如果equal的结果没有变,那么hashcode()也应总是返回相同的值)
总的来说,这两个方法的关系:
假如a.equals(b),那么a.hashCode() 应等于b.hashCode()
实践上讲
如果你重写了其中一个方法,那么务必重写另外一个方法
equals()和hashCode()所计算的属性集(set of fields)应当是一样的
如何更快地重写这两个方法呢?
public class Person {
private String name;
private int age;
// ...
public int hashCode() {
return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
// if deriving: appendSuper(super.hashCode()).
append(name).
append(age).
toHashCode();
}
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();
}
}
2、如果你是用eclipse,可以在代码编辑区右键,然后选择 Source > Generate hashCode() and equals()
另外请记得
stackoverflow链接:
http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java
专栏介绍:
非常喜欢stackoverflow,总能在上面找到疑难杂症的解决办法。偶然发现该网站有一个热度榜单。于是精选了热度较高的一些问题,然后按照自己的理解,把大家的讨论梳理出来。因此,这些文章不是真正的翻译,而是按照自己的理解做了一些增删、润色,希望能把上面的讨论,更精简有效地分享给大家。
如需转载,请注明原文地址
【Stackoverflow好问题】重写(Override)equlas和hashCode方法时应考虑的问题
标签:hashcode hash stackoverflow问题精选 equals
原文地址:http://blog.csdn.net/lizeyang/article/details/41643829