From f9db913c059dde60e4efb7cc291bc3c77b1c07d9 Mon Sep 17 00:00:00 2001 From: joyang1 Date: Tue, 30 Jul 2019 22:49:59 +0800 Subject: [PATCH] add Article 9 for effective java --- docs/effective-java.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/effective-java.md b/docs/effective-java.md index 1e296a1..ec59691 100644 --- a/docs/effective-java.md +++ b/docs/effective-java.md @@ -887,4 +887,17 @@ public boolean equals(Object o) { - **覆盖 equals 时总是要覆盖 hashCode(见第 9 条)**。 - **不要企图让 equals 方法过于智能**。 -- **不要将 equals 声明中的 Object 对象替换为其他的类型**。 \ No newline at end of file +- **不要将 equals 声明中的 Object 对象替换为其他的类型**。 + +### 第 9 条:覆盖 equals 总要覆盖 hashCode +一个很常见的错误根源在于没有覆盖 hashCode 方法。在每个覆盖 equals 方法的类中,也必须覆盖 hashCode 方法。如果不这样做的话,就会违反 Object.hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合类包括 HashMap、HashSet 和 HashTable。 + +下面是约定的内容,摘自 Object 规范[JavaSE6]: + +- 在应用程序执行期间,只要对象的 equals 方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode 方法都必须始终如意的返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。 + +- 如果两个对象根据 equals(Object) 方法比较是相等的,那么调用两个对象中任意一个对象的 hashCode 方法都必须产生同样的整数结果。 + +- 如果两个对象根据 equals(Object) 方法比较是不相等的,那么调用两个对象中任意一个对象的 hashCode 方法,则不一定要产生不同的整数结果。但是作为程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表(hashTable)的性能。 + +**因没有覆盖 hashCode 而违反的关键约定是第二条:相等的对象必须具有相等的散列码(hash code)**。根据类的 equals 方法,两个截然不同的实例在逻辑上是有可能相等的,但是,根据 Object 类的 hashCode 方法,它们仅仅是两个没有共同之处的对象。因此,对象的 hashCode 方法返回两个看起来是随机的整数,而不是根据第二个约定所要求的那样,返回两个相等的整数。 \ No newline at end of file