Skip to content

Commit 85639e3

Browse files
committed
重写(Override)equlas和hashCode方法时应考虑的问题
1 parent 563d447 commit 85639e3

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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

Comments
 (0)