mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-01-16 15:20:26 +08:00
update 11. 重写 equals 方法时同时也要重写 hashcode 方法
This commit is contained in:
parent
526a90835d
commit
138823990d
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user