Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /