在 Java 中,equals 和 hashCode 是两个不同的方法,用于比较对象的相等性和计算对象的哈希码。它们的主要区别如下:
equals 方法是用来比较两个对象的内容是否相等,通常需要被重写以实现自定义的相等判断逻辑;而 hashCode 方法则是用来计算对象的哈希码,通常需要与 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) 应该始终返回相同的结果,前提是 x 和 y 上的变量没有被修改。
非空性:对于任何非空引用 x,x.equals(null) 必须返回 false。
而 hashCode 方法则需要满足以下特性:
如果两个对象根据 equals 方法比较相等,则它们的 hashCode 方法必须返回相同的值。
如果两个对象根据 equals 方法比较不相等,则它们的 hashCode 方法不一定要返回不同的值(但是,不同的哈希码能提高哈希表的性能)。
在同一应用程序的多次执行中,对于同一对象调用 hashCode 方法必须始终返回相同的整数。但是,在应用程序重新启动期间不需要保持这种属性。
在 Java 中,通常建议同时重写 equals 和 hashCode 方法,以确保对象的相等性和哈希码计算的一致性。可以使用 IDE 自动生成这些方法的实现。