[英]Why can index of backing table in java.util.HashMap be the same for two different provided keys?
[英]java.util.HashMap get: does key have to be exactly the same object as what is stored in the HashMap, or can the keys just be “equal”
假設我有一個HashMap M
我想在此HashMap上調用“ get”函數,並找到與給定對象S
關聯的值。 但是我沒有對對象S
的實際引用,因此我創建了一個新對象S_new
其內容與S
的內容相同。 如果我調用M.get(S_new)
,那會給我與鍵S
關聯的值嗎?
從Map#get的文檔中 :
public V get(Object key)
返回指定鍵所映射到的值;如果此映射不包含鍵的映射關系,則返回null。 更正式地講,如果此映射包含從鍵
k
到值v的映射,使得(key==null ? k==null : key.equals(k))
,則此方法返回v
; 否則返回null
。 (最多可以有一個這樣的映射。)
因此,只要您傳遞的參數以使映射鍵被視為等效的方式覆蓋equals
,就可以使用其他實例從映射中檢索值。
另外,正如@Eugene和其他人提到的那樣,對於HashMap
您還必須重寫hashCode
方法,並確保您的實例返回與鍵相同的值。 通常,最佳實踐是確保相等實現是對稱的 (即A.equals(B)
<==> B.equals(A)
),並且相等的值應具有相同的hashCode
。
是的,只要hashcode
和equals
會產生相同的精確值,就可以。 還要注意, get
甚至不需要參數為T
它是Object
,因此any
滿足哈希碼和equals的類型都可以工作
不可以使用鍵從地圖中獲取價值,並不意味着鍵應該與放置時使用的對象相同。
唯一的問題是hashcode&equals應該相同,這就是如果您想使用自己的類對象作為鍵的原因,它必須重寫Hashcode&equals方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.