📜  关于 hashCode 和 equals 方法的有趣面试问题(1)

📅  最后修改于: 2023-12-03 15:22:33.686000             🧑  作者: Mango

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

在 Java 中,hashCode 和 equals 方法是 Object 类里的两个重要方法,用于比较两个对象是否相等。但是,这两个方法在实现时有许多需要注意的地方,所以它们也经常成为面试中的重点考察内容。

以下是关于 hashCode 和 equals 方法的一些有趣面试问题:

1. 什么是 hashCode?

在 Java 中,hashCode 是一个整数,用于表示对象的内存地址。它的主要作用是帮助我们在哈希表等数据结构中快速地查找某个对象,例如 HashMap、HashSet 等。

2. hashCode 方法的实现规则是什么?

hashCode 方法的默认实现是返回对象的内存地址。但如果我们自己定义了一个类,我们就需要自己实现 hashCode 方法。实现规则如下:

  • 在同一个应用程序执行期间,如果一个对象的 equals 方法返回 true,则该对象的 hashCode 必须返回相同的整数。
  • 如果两个对象的 equals 方法返回 false,则它们的 hashCode 值不一定不同。但是,为了减少冲突,不同的对象应该有不同的 hashCode 值。
3. equals 方法的实现规则是什么?

equals 方法主要用于比较两个对象是否相等。实现规则如下:

  • 自反性:对于任何非空引用 x,x.equals(x) 必须返回 true。
  • 对称性:对于任何非空引用 x 和 y,如果 x.equals(y) 返回 true,则 y.equals(x) 也必须返回 true。
  • 传递性:对于任何非空引用 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 也返回 true,则 x.equals(z) 必须返回 true。
  • 一致性:对于任何非空引用 x 和 y,多次调用 x.equals(y) 必须始终返回 true 或始终返回 false,前提是对象在比较时所用的信息没有被修改。
  • 非空性:对于任何非空引用 x,x.equals(null) 必须返回 false。
4. 在 Java 中有哪些类重写了 hashCode 和 equals 方法?

Java 中有很多类都重写了 hashCode 和 equals 方法,以下是其中的一些:

  • String
  • Integer、Long、Double 等包装类
  • Date、Calendar、Locale 等类
  • Collections、Arrays、EnumSet 等工具类
  • 自定义类(必须自己重写)
5. hashCode 和 equals 方法的运用场景有哪些?
  • 作为 HashMap、HashSet 等数据结构的 key 使用。
  • 对于需要比较对象相等性的场景,例如在集合中查找某个对象、判断某个对象是否已经存在等。
  • 在序列化、反序列化时使用。

以上就是关于 hashCode 和 equals 方法的一些有趣面试问题。开发者们在实际编程中需要注意这些知识点,以免出现不必要的错误。