为什么 Entry 接口定义了 equals 和 hashCode 等方法?

Why Entry interface defines methods like equals and hashCode?

我看到接口 java.util.Map.Entry 有方法:

boolean equals(Object o);
int hashCode();

为什么上述方法是 Entry 接口的一部分,而相同的方法是从 Object class 继承的?

感谢和问候, 拉胡尔

正如压倒一切的定义所说;当从另一个 class 扩展的 class 想要使用父 class 的大部分功能并想要实现 特定的 功能时使用它在某些情况下。 boolean equals() 的 oracle 文档说;

This ensures that the equals method works properly across different implementations of the Map.Entry interface.

因此,对于 equals() 方法的具体实现,boolean equals(Object o)int hashCode() 被覆盖。

只是为了给 Javadoc 留个位置。

在接口中声明 equals()hashCode() 不会强制实现 class 来实现它们中的任何一个。从 Object 继承的方法满足接口的 技术 要求(但不是 Maps 中所需的语义)。

Map.Entry 需要特定的 equals/hashCode 行为,因此 Java 设计者选择将它们冗余声明为 Map.Entry 接口的一部分并将 Javadoc 那里解释了如何正确地做到这一点。

考虑三点:

  • 技术的角度来看,这是没有必要的:每个class都从Object继承这两个方法class.从技术上讲,将这两个方法添加到接口中不会增加任何东西

  • 实现的角度来看:这些定义并不"override"classObject的定义。因此,您无需编写自己的实现即可实现此接口。

  • 文档 的角度来看:Map.Entry.equals() and Map.Entry.hashCode() 的文档对这些方法在接口的任何实现中应该做什么有非常具体的要求。

您可以将关于这两种方法的要求的文档放入接口的一般文档中,但这会使查找(和阅读)该文档变得更加困难。

理想情况下,查找接口的人会看到它声明了这两个方法,好奇并阅读这两个方法的接口文档,然后得到提示他应该如何正确实现这些方法 class实现接口的es。

有一条经验法则,如果您要重写其中一种方法(即 equals() 或 hashCode() ),则必须同时重写它们否则违反了为 equals() 和 hashCode() 制定的合同。方法约定请参考Oracle's java doc

因此,Entry 接口会覆盖这两种方法以实现特定功能。

此外,如果您(或入口界面)不覆盖class的equals()方法,

you won't be able to use those objects as a key in a hashtable

and you probably won't get accurate Sets such that there are no conceptual duplicates.

此外,

The equals() method in class Object uses only the == operator for comparisons, so unless you override equals(), two objects are considered equal only if the two references refer to the same object.

如果您查看 Object class 的源代码,您会发现 equals() 方法的以下代码。

  public boolean equals(Object obj) 
{
    return (this == obj);
}