mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2024-12-28 22:01:01 +08:00
Update 11. 重写equals方法时同时也要重写hashcode方法.md
This commit is contained in:
parent
138823990d
commit
b4914113ca
@ -33,10 +33,11 @@ m.put(new PhoneNumber(707, 867, 5309), "Jenny");
|
||||
|
||||
1. 声明一个 int 类型的变量 result,并将其初始化为对象中第一个重要属性 `c` 的哈希码,如下面步骤 2.a 中所计算的那样。(回顾条目 10,重要的属性是影响比较相等的领域。)
|
||||
2. 对于对象中剩余的重要属性 `f`,请执行以下操作:
|
||||
a. 比较属性 `f` 与属性 `c` 的 int 类型的哈希码:
|
||||
-- i. 如果这个属性是基本类型的,使用 `Type.hashCode(f)` 方法计算,其中 `Type` 类是对应属性 `f` 基本类型的包装类。
|
||||
-- ii. 如果该属性是一个对象引用,并且该类的 equals 方法通过递归调用 equals 来比较该属性,并递归地调用 hashCode 方法。 如果需要更复杂的比较,则计算此字段的“范式(“canonical representation)”,并在范式上调用 hashCode。 如果该字段的值为空,则使用 0(也可以使用其他常数,但通常来使用 0 表示)。
|
||||
-- iii. 如果属性 `f` 是一个数组,把它看作每个重要的元素都是一个独立的属性。 也就是说,通过递归地应用这些规则计算每个重要元素的哈希码,并且将每个步骤 2.b 的值合并。 如果数组没有重要的元素,则使用一个常量,最好不要为 0。如果所有元素都很重要,则使用 `Arrays.hashCode` 方法。
|
||||
a. 比较属性 `f` 与属性 `c` 的 int 类型的哈希码:<br/>
|
||||
|
||||
-- i. 如果这个属性是基本类型的,使用 `Type.hashCode(f)` 方法计算,其中 `Type` 类是对应属性 `f` 基本类型的包装类。<br/>
|
||||
-- ii. 如果该属性是一个对象引用,并且该类的 equals 方法通过递归调用 equals 来比较该属性,并递归地调用 hashCode 方法。 如果需要更复杂的比较,则计算此字段的“范式(“canonical representation)”,并在范式上调用 hashCode。 如果该字段的值为空,则使用 0(也可以使用其他常数,但通常来使用 0 表示)。<br/>
|
||||
-- iii. 如果属性 `f` 是一个数组,把它看作每个重要的元素都是一个独立的属性。 也就是说,通过递归地应用这些规则计算每个重要元素的哈希码,并且将每个步骤 2.b 的值合并。 如果数组没有重要的元素,则使用一个常量,最好不要为 0。如果所有元素都很重要,则使用 `Arrays.hashCode` 方法。<br/>
|
||||
|
||||
b. 将步骤 2.a 中属性 c 计算出的哈希码合并为如下结果:`result = 31 * result + c;`
|
||||
|
||||
@ -124,4 +125,4 @@ public int hashCode() {
|
||||
|
||||
|
||||
|
||||
[1]: http://com.google.common.hash.hashing/
|
||||
[1]: http://com.google.common.hash.hashing/
|
||||
|
Loading…
Reference in New Issue
Block a user