2 回答

TA貢獻1890條經驗 獲得超9個贊
兩個對象的hashCode互相相等,但是==和equals()會得到false是什么情況?
根據Java文檔:
如果對象相等(即
x.equals(y) == true
),那么hashCode
這些對象也應該相等(即x.hashCode() == y.hashCode()
)如果兩個對象相等
hashCode
(iex.hashCode() == y.hashCode()
),那么這些對象不必須相等(iex.equals(y) == true/false
)

TA貢獻1828條經驗 獲得超3個贊
當兩個對象的 hashCode 彼此相等,但是 == 和 equals() 會得到 false 是什么情況?
當發生哈希碼沖突時。
例子
考慮這兩個多頭:
Long l1 = 1L;
Long l2 = 4294967296L; //which is 2 ^ 32
您是否同意存在不同并且equals()會返回false?然而,結果
l1.hashCode() == l2.hashCode()
是真的。
為什么?查看 hashCode 的實現Long:
public static int hashCode(long value) {
return (int)(value ^ (value >>> 32));
}
由于 long 可以有 2^64 個值,而 hashcode 的返回值是一個可以有 2^32 個值的 int,所以發生沖突是正常的(每個值都會與 2^32 個其他值發生沖突)。
澄清
但是我曾經聽說 override equals() 也必須覆蓋 hashCode() ,所以這個問題不會發生。
是的,當您覆蓋時,您equals()也應該覆蓋hashCode()。這是真的,但我認為你混淆了含義。從hashcode 的 javadoc:
如果兩個對象根據 equals(Object) 方法相等,則對兩個對象中的每一個調用 hashCode 方法必須產生相同的整數結果。
如果根據 equals(java.lang.Object) 方法,如果兩個對象不相等,則不需要對兩個對象中的每一個調用 hashCode 方法都必須產生不同的整數結果。但是,程序員應該意識到,為不相等的對象生成不同的整數結果可能會提高哈希表的性能。
所以含義
a.equals(b) => a.hashCode() == b.hashCode()
必須始終為真(如果您的方法正確實施)但相反的含義
a.hashCode() == b.hashCode() => a.equals(b)
不一定要。
添加回答
舉報