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

This commit is contained in:
sjsdfg 2018-10-10 11:24:08 +08:00
parent 526a90835d
commit 138823990d

View File

@ -1,12 +1,12 @@
# 11. 重写 equals 方法时同时也要重写 hashcode 方法 # 11. 重写 equals 方法时同时也要重写 hashcode 方法
**在每个类中,在重写 equals 方法的时侯,一定要重写 hashcode 方法。**如果不这样做,你的类违反了 hashCode 的通用约定,这会阻止它在 HashMap 和 HashSet 这样的集合中正常工作。根据 Object 规范,以下时具体约定。 **在每个类中,在重写 equals 方法的时侯,一定要重写 hashcode 方法。** 如果不这样做,你的类违反了 hashCode 的通用约定,这会阻止它在 HashMap 和 HashSet 这样的集合中正常工作。根据 Object 规范,以下时具体约定。
1. 当在一个应用程序执行过程中,如果在 equals 方法比较中没有修改任何信息,在一个对象上重复调用 hashCode 方法时,它必须始终返回相同的值。从一个应用程序到另一个应用程序的每一次执行返回的值可以是不一致的。 1. 当在一个应用程序执行过程中,如果在 equals 方法比较中没有修改任何信息,在一个对象上重复调用 hashCode 方法时,它必须始终返回相同的值。从一个应用程序到另一个应用程序的每一次执行返回的值可以是不一致的。
2. 如果两个对象根据 equals(Object) 方法比较是相等的,那么在两个对象上调用 hashCode 就必须产生的结果是相同的整数。 2. 如果两个对象根据 equals(Object) 方法比较是相等的,那么在两个对象上调用 hashCode 就必须产生的结果是相同的整数。
3. 如果两个对象根据 equals(Object) 方法比较并不相等,则不要求在每个对象上调用 hashCode 都必须产生不同的结果。 但是程序员应该意识到为不相等的对象生成不同的结果可能会提高散列表hash tables的性能。 3. 如果两个对象根据 equals(Object) 方法比较并不相等,则不要求在每个对象上调用 hashCode 都必须产生不同的结果。 但是程序员应该意识到为不相等的对象生成不同的结果可能会提高散列表hash tables的性能。
**当无法重写 hashCode 时,所违反第二个关键条款是:相等的对象必须具有相等的哈希码( hash codes。**根据类的 equals 方法,两个不同的实例可能在逻辑上是相同的,但是对于 Object 类的 hashCode 方法,它们只是两个没有什么共同之处的对象。因此, Object 类的 hashCode 方法返回两个看似随机的数字,而不是按约定要求的两个相等的数字。 **当无法重写 hashCode 时,所违反第二个关键条款是:相等的对象必须具有相等的哈希码( hash codes。** 根据类的 equals 方法,两个不同的实例可能在逻辑上是相同的,但是对于 Object 类的 hashCode 方法,它们只是两个没有什么共同之处的对象。因此, Object 类的 hashCode 方法返回两个看似随机的数字,而不是按约定要求的两个相等的数字。
举例说明,假设你使用条目 10 中的 `PhoneNumber` 类的实例做为 HashMap 的键key 举例说明,假设你使用条目 10 中的 `PhoneNumber` 类的实例做为 HashMap 的键key
@ -92,7 +92,8 @@ public int hashCode() {
private int hashCode; // Automatically initialized to 0 private int hashCode; // Automatically initialized to 0
@Override public int hashCode() { @Override
public int hashCode() {
int result = hashCode; int result = hashCode;