![](/img/trans.png)
[英]Why should two equal objects return equal hash codes if I don't want to use my object as a key in a hash table?
[英]Why can objects with equal hash codes be not equal
我在書中發現了這句話:
如果兩個對象的哈希碼相等,則可能並不意味着對象相等。
有人可以給我解釋一下這句話嗎?
例如,考慮Long類的兩個對象。 由於hashCode
返回一個int
,並且long
(和Long
)類型的范圍大於int
,這意味着必須存在兩個具有相同hashCode
Long
對象,即使它們彼此不相等。
答案很簡單: hashCode()
偶然會為兩個完全不同的對象產生相同的數字。
哈希碼是一個數字值,用於在基於哈希的集合中插入和標識對象。
它是一個固定的大小值,因此它對於每個現有對象都不是唯一的,因此有時會遭受碰撞。 基本上,hashCode()可以為兩個不同的對象產生相同的值。
例:
String first = "wh";
String second = "xI";
System.out.println(first.equals(second));
System.out.println(first.hashCode() + " " + second.hashCode());
在基於哈希的實現中,無論何時您檢查兩個對象的相等性,它都首先檢查哈希代碼,如果兩個對象都相同,則調用equals方法,該方法也返回true,則只有兩個對象被視為相等。
2個相等的對象將具有相同的哈希碼。
具有相同hascode的2個對象不必相等。
可以說hascode方法通過計數名稱的字母來產生其值(這是不好的做法,但是我正在使用此示例進行解釋),但是equals比較每個字符:
Paul和Mary都將返回hascode 4,但是字符不相等
即使對象的hashCode在創建時就是內存地址,由於垃圾回收器的存在,它仍必須存儲在對象標頭中。
垃圾收集器可以自由移動對象以完成其工作,因此當前內存地址可能隨時更改。 然而:
{@code hashCode}方法必須一致地返回相同的整數,前提是未修改該對象的{@code equals}比較中使用的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.