簡體   English   中英

為什么具有相同哈希碼的對象不相等

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM