假設我有一個HashMap M
。我想在這個HashMap上調用「get」函數,並找到與給定對象S
關聯的值。但我沒有實際參考對象S
,因此我創建了一個新對象S_new
,其內容與S
的內容相同。如果我撥打M.get(S_new)
,是否會給我提供與密鑰S
相關的價值?java.util.HashMap get:key必須與存儲在HashMap中的對象完全相同,或者密鑰可以「相等」
回答
從the documentation for Map#get:
public V get(Object key)
返回指定的鍵映射到的值;如果此映射不包含鍵映射,則返回null。更正式地說,如果該映射 包含從密鑰
k
到值爲v1的映射,使得(key==null ? k==null : key.equals(k))
,則該方法返回v
;否則它會返回null
。 (可以有至多一個這樣的映射。)
所以只要參數你傳遞覆蓋equals
以這樣的方式,地圖鍵被看作是等同的,你可以使用不同的實例,以檢索來自地圖的值。
此外,正如@Eugene和其他人提到的,對於HashMap
,您還必須覆蓋hashCode
方法,並確保您的實例返回與您的密鑰相同的值。一般來說,最佳做法是確保您的平等執行是對稱(即A.equals(B)
< ==>B.equals(A)
),並且相等的值應具有相同的hashCode
。
在一個基於散列的映射或集合中,'hashCode'也必須被覆蓋或等於永遠不會被測試。 –
OP要求'HashMap',所以重要的是要有一個匹配的'hashCode()'方法。 –
@KevinKrumwiede - 是的,好點,這是準確的。 – nbrooks
是的,只要hashcode
和equals
會產生相同的確切值。還要注意的是get
甚至不要求的參數是T
- 這是Object
,所以any
類型將履行的哈希碼,等於將工作
在實踐中,任何其他類型都可以兼容地實現equals和hashCode是不太可能的也是不可能的。請參閱[此答案](https://stackoverflow.com/a/18575969/1953590)。 –
@KevinKrumwiede我同意。我還沒有看到一個情況,除了'T'之外的東西從邏輯意義上來說可以從'Map'獲得;仍然這是由規範允許的... – Eugene
否從地圖使用鍵獲取值並不意味着該鍵應該是放置時使用的同一對象。
唯一的問題是,哈希碼&等於應該是相同的,這就是它強制重寫哈希碼&等於方法的原因,如果你想使用自己的類對象作爲關鍵。
- 1. 熊貓:列必須與密鑰長度相同
- 2. 具有相同的hashCode相等的對象不映射到相同值的HashMap
- 3. 在ObjectStateManager中已存在具有相同密鑰的對象
- 4. 2個對象可以有相同的密鑰名稱嗎?
- 5. C#:相同的對象必須相同的HashCode?
- 6. ObjectStatemanager中已存在具有相同密鑰的對象
- 7. ObjectStateManager中已存在具有相同密鑰的對象
- 8. ObjectStateManager中已存在具有相同密鑰的對象
- 9. 在HashMap中使用相同的密鑰存儲/取消設置多個值
- 10. 具有相同密鑰的NSDictionary對象
- 11. 具有相同密鑰的JSON對象
- 12. ObjectStateManager中已存在具有相同密鑰的對象。該ObjectStateManager不能使用相同的密鑰
- 13. 相同的密鑰 - 不同價與一個HashMap
- 14. 對於多個應用程序使用相同的密鑰存儲可以嗎?
- 15. 兩個相等的對象必須具有相同的toString輸出嗎?
- 16. Python中的熊貓錯誤:列的長度必須與密鑰長度相同
- 17. 必須在MongoDB中新建一個與Schema完全相同的文檔嗎?
- 18. 一個使用相同的密鑰對象已存在於ObjectStateManager
- 19. 對象具有相同的密鑰已經存在ObjectStateManager
- 20. 如何存儲具有相同密鑰的散列表中的多個對象?
- 21. 對象狀態管理器中已存在具有相同密鑰的對象。
- 22. 在Java HashMap中存儲兩次「密鑰」?
- 23. 存儲相關的密鑰爲OID或字符串在MongoDB中
- 24. HashMap的 - 以前的主要新相等的對象
- 25. 如何在IDictionary中存儲相同的密鑰?
- 26. Android庫必須使用完全相同的版本
- 27. android.support庫必須使用完全相同的版本規範
- 28. Java HashMap來存儲不同的對象
- 29. Collectors.toMap具有相同的密鑰(打印相同的密鑰)
- 30. Machine.config中和App.config中存儲相同的密鑰
絕對沒有,它們不是同一個實例。 – Euclides
簡短的答案 - 如果對象相同且具有相同的hashCode值,它將正常工作。 – udalmik
如果他們散列相同 - 是的。如果不是 - 不。應該避免嗎? - 絕對是 –