在 Java 中,equals 和 hashCode 是兩個不同的方法,用于比較對象的相等性和計算對象的哈希碼。它們的主要區(qū)別如下:
equals 方法是用來比較兩個對象的內(nèi)容是否相等,通常需要被重寫以實現(xiàn)自定義的相等判斷邏輯;而 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,多次調(diào)用 x.equals(y) 應(yīng)該始終返回相同的結(jié)果,前提是 x 和 y 上的變量沒有被修改。
非空性:對于任何非空引用 x,x.equals(null) 必須返回 false。
而 hashCode 方法則需要滿足以下特性:
如果兩個對象根據(jù) equals 方法比較相等,則它們的 hashCode 方法必須返回相同的值。
如果兩個對象根據(jù) equals 方法比較不相等,則它們的 hashCode 方法不一定要返回不同的值(但是,不同的哈希碼能提高哈希表的性能)。
在同一應(yīng)用程序的多次執(zhí)行中,對于同一對象調(diào)用 hashCode 方法必須始終返回相同的整數(shù)。但是,在應(yīng)用程序重新啟動期間不需要保持這種屬性。
在 Java 中,通常建議同時重寫 equals 和 hashCode 方法,以確保對象的相等性和哈希碼計算的一致性??梢允褂?IDE 自動生成這些方法的實現(xiàn)。