有关 hashCode 和 equals 方法的有趣面试问题

javaobject oriented programmingprogramming更新于 2024/8/5 2:13:00

在我的 Java 编程生涯中,我遇到的最有趣的面试问题之一就是有关 hashCode 和 equals 方法。面试官总是检查应聘者是否知道 equals() 和 hasCode() 方法,因为它们是 Java Object 类中最重要但最令人困惑的方法。这两种方法都用于检查两个或多个对象是否相等。本文旨在提供一些与 hashCode() 和 equals() 方法相关的有趣面试问题,这些问题将提高应聘者的知识和技能。

有关 hashCode() 和 equals() 方法的 Java 面试问题

当面试官开始询问 hashCode() 和 equals() 方法时,第一个问题可能是您是否知道 hashCode() 和 equals() 方法?所以,让我们从这个问题开始讨论。

Java 中的 hashCode() 和 equals() 方法

hashCode() 方法返回对象的哈希码值。哈希码是 Java 中为每个对象生成的整数值。如果我们比较两个对象,如果两个对象按照 equals() 方法相等,它将返回相同的哈希值,否则返回不同的哈希值。

默认情况下,equals() 方法仅比较对象的内存位置,即检查给定对象是否引用同一个对象。但是,我们可以覆盖此方法并在其中放入我们自己的逻辑来比较给定对象的值。如果两个对象相同,则返回 true,否则返回 false。

在哪个包中可以找到 hashCode() 和 equals() 方法?

这些方法存在于 'java.util' 包的 'Object' 类中。对象类是 Java 中每个类的超类。

列出与 hashCode() 方法关联的契约

以下是与 hashCode() 方法关联的契约列表 −

  • 如果两个对象根据 equals 方法相等,则它们必须具有相同的哈希码。

  • 如果两个对象具有相同的哈希码,则根据 equals 方法,它们可能相等,也可能不相等。

  • 对象的哈希码在其生命周期内不应更改,除非影响其相等性的属性发生变化。

列出与 equals() 方法关联的契约

以下是与 equals() 方法关联的契约列表 −

  • 对于任何非空对象 obj,它是反身方法,obj.equals(obj) 应返回 true。

  • 对于任何非空对象 obj1 和 obj2,它是对称方法,当且仅当 obj2.equals(obj1) 返回 true 时,obj1.equals(obj2) 才应返回 true。

  • 对于任何非空对象 obj1、obj2 和 obj3,它是传递方法,如果 obj1.equals(obj2) 返回 true 且 obj2.equals(obj3) 返回 true,则 obj1.equals(obj3) 应返回 true。

  • 对于任何非空对象 obj,obj.equals(null) 应返回 false。

解释 hashCode() 和 equals() 的重要性方法

hashCode() 和 equals() 方法很重要,因为它们定义了对象在存储在依赖于哈希(用于将对象映射到整数值)的集合(例如 HashMap 或 HashSet)中时的行为方式。这些集合使用对象的哈希码来确定其在底层数组中的插槽,然后使用 equals 方法检查是否存在冲突或重复。如果 hashCode 和 equals 方法未正确实现,集合可能无法正常运行,并可能产生意外结果。

是否有必要同时覆盖 hashCode() 和 equals() 方法?

我们应该始终同时覆盖这两个方法,因为它们具有需要维护的契约。如果我们只覆盖其中一种,我们可能会破坏契约并导致不一致。第二件事是,我们需要在两种方法中使用相同的一组属性或字段来确定对象的相等性。例如,如果我们在 equals 方法中使用 name 和 age,我们也应该在 hashCode 方法中使用它们。

解释术语"哈希集合的碰撞"

在哈希过程中,多个对象在通过内置方法"equals()"评估后可能会获得相同的整数值,这会导致称为碰撞的情况。当两个或多个键具有相同的哈希值并映射到同一个存储桶时,就会发生这种情况,从而导致性能下降。

Java 中"=="和 equals() 方法有什么区别?

"=="和 equals() 方法都用于比较两个实体,并且在比较时它们会检查对象的内存位置。但是,我们无法覆盖"=="运算符,当我们必须比较两个原始值时,最好使用此运算符。

结论

本文展示了 equals() 和 hasCode() 方法在 Java 面试中的重要性。我们讨论了有关 hashCode() 和 equals() 方法的一系列重要且有趣的面试问题。理解所讨论的问题后,人们可以轻松破解面试。


相关文章