Update 11. 重写equals方法时同时也要重写hashcode方法.md

This commit is contained in:
Joe 2018-10-10 11:26:06 +08:00 committed by GitHub
parent 138823990d
commit b4914113ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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/>
&nbsp;&nbsp;&nbsp;&nbsp;-- i. 如果这个属性是基本类型的,使用 `Type.hashCode(f)` 方法计算,其中 `Type` 类是对应属性 `f` 基本类型的包装类。<br/>
&nbsp;&nbsp;&nbsp;&nbsp;-- ii. 如果该属性是一个对象引用,并且该类的 equals 方法通过递归调用 equals 来比较该属性,并递归地调用 hashCode 方法。 如果需要更复杂的比较则计算此字段的“范式“canonical representation并在范式上调用 hashCode。 如果该字段的值为空,则使用 0也可以使用其他常数但通常来使用 0 表示)。<br/>
&nbsp;&nbsp;&nbsp;&nbsp; -- 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/