|
| 1 | +##重写(Override)equlas和hashCode方法时应考虑的问题 |
| 2 | + |
| 3 | +###理论上讲(编程语言、数学层面) |
| 4 | +equals() 定义了对象的相等关系(自反性、对称性、传递性)(有点抽象,更详细说明,请参考javadoc) 。 |
| 5 | +另外,它还具有一致性(也就是说,如果一个对象没有修改,那么对象的equals方法,应总是返回相同的值),此外,o.equals(null)应当总是返回false。 |
| 6 | +hashCode()(javadoc)也必须具备一致性的(也就是说,如果equal的结果没有变,那么hashcode()也应总是返回相同的值) |
| 7 | + |
| 8 | +总的来说,这两个方法的关系: |
| 9 | + |
| 10 | +**假如a.equals(b),那么a.hashCode() 应等于b.hashCode()** |
| 11 | + |
| 12 | +###实践上讲 |
| 13 | +**如果你重写了其中一个方法,那么务必重写另外一个方法** |
| 14 | + |
| 15 | +equals()和hashCode()所计算的属性集(set of fields)应当是一样的 |
| 16 | +如何更快地重写这两个方法呢? |
| 17 | +1. 使用[Apache Commons Lang library](http://commons.apache.org/lang/)中的[EqualsBuilder](http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html)、[HashCodeBuilder](http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html) |
| 18 | +```java |
| 19 | +public class Person { |
| 20 | + private String name; |
| 21 | + private int age; |
| 22 | + // ... |
| 23 | + |
| 24 | + public int hashCode() { |
| 25 | + return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers |
| 26 | + // if deriving: appendSuper(super.hashCode()). |
| 27 | + append(name). |
| 28 | + append(age). |
| 29 | + toHashCode(); |
| 30 | + } |
| 31 | + |
| 32 | + public boolean equals(Object obj) { |
| 33 | + if (!(obj instanceof Person)) |
| 34 | + return false; |
| 35 | + if (obj == this) |
| 36 | + return true; |
| 37 | + |
| 38 | + Person rhs = (Person) obj; |
| 39 | + return new EqualsBuilder(). |
| 40 | + // if deriving: appendSuper(super.equals(obj)). |
| 41 | + append(name, rhs.name). |
| 42 | + append(age, rhs.age). |
| 43 | + isEquals(); |
| 44 | + } |
| 45 | +} |
| 46 | +``` |
| 47 | + |
| 48 | +2. 如果你是用eclipse,可以在代码编辑区右键,然后选择 Source > Generate hashCode() and equals() |
| 49 | + |
| 50 | +**另外请记得** |
| 51 | +当你使用一些基于Hash的 Collection 、 Map,例如HashSet, LinkedHashSet, HashMap, Hashtable, 、WeakHashMap等。在键值对被放到集合中之后,请确保其key值所对应的hashCode()是保持不变的。比较可靠的一个办法,是保持这些key是不可变的,这也能带来不少好处 |
| 52 | + |
| 53 | + |
| 54 | +stackoverflow链接: |
| 55 | +http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java |
0 commit comments