回答
如果不可變,對象的散列碼不會改變,它允許緩存不同鍵的散列碼,這使得整個檢索過程非常快。 對於可變對象,hashCode()可能依賴於可能發生變化的字段,如果發生這種情況,由於hashCode()返回不同的值,您將無法在HashMap中找到該鍵(及其值)。
如果你的對象是不可變的,並且正確地實現了hashcode/equals,你可以很好地將它們用作hashmap中的鍵。
是的,因爲它是不可改變的。
讓我們假設我有一個類
MyKey key = new MyKey("shreyansh"); //assume hashCode=1234
myHashMap.put(key, "value");
// Below code will change the key hashCode() and equals()
// but it's location is not changed.
key.setName("jogi"); //assume new hashCode=7890
//below will return null, because HashMap will try to look for key
//in the same index as it was stored but since key is mutated,
//there will be no match and it will return null.
myHashMap.get(new MyKey("shreyansh"));
這裏同時訪問,使用鍵 「Shreyansh」 它將返回nulll
您可以在這裏找到答案:How HashMap works in Java
String,Integer和其他包裝類是HashMap鍵的自然候選者,而String也是最常用的鍵,因爲String是不可變的並且是final,並且覆蓋equals和hashcod e()方法。其他包裝類也共享類似的屬性。不可變性是必需的,以防止用於計算hashCode()的字段上的更改,因爲如果key對象在插入和檢索期間返回不同的hashCode,將無法從HashMap獲取對象。不變性是最好的,因爲它提供了其他優點,如線程安全性。如果只通過最終確定某些字段可以保持hashCode相同,那麼您也可以這樣做。由於equals()和hashCode()方法在從HashMap中檢索value對象時使用,因此重要的是key對象會正確地覆蓋這些方法並跟隨聯繫。如果不相等的對象返回不同的哈希碼比碰撞的機率更小,隨後提高HashMap的性能。
也有另一種堆棧的討論:Why are immutable objects in hashmaps so effective
兩個散列碼和equals方法在看跌的使用和獲得的HashMap的方法。您需要確保在將其與關鍵對象放在一起後,始終可以從地圖中獲取值對象。不管你是否改變關鍵物體。但不可變對象足以實現這一目標。
- 1. 將對象數組映射到按對象關鍵字分組的映射js不可變
- 2. 創建可用作散列映射關鍵字的Java類
- 3. Clojure散列映射查詢鍵和值
- 4. 將JSON映射到具有不同關鍵字的Java對象
- 5. 原始Java Map的對象散列映射(將POJO映射到映射中)
- 6. Android實現包含另一個散列映射的包含散列映射的可包含對象
- 7. Java8:通過鍵映射對象列表
- 8. 哈希映射對象鍵
- 9. 對象保留鍵映射
- 10. 映射器:鍵值對象
- 11. 關鍵字映射錯誤
- 12. 帶有散列映射的不可變類的示例
- 13. 散列映射鍵 - 如果存在映射
- 14. 使用構建器(使用immutables註釋處理器)將映射對象映射到不可變對象映射
- 15. 按鍵值搜索不可變映射
- 16. Restkit - 如何映射具有可變鍵名的json對象
- 17. 對象/關係映射
- 18. 對象關係映射
- 19. 關係對象映射c#
- 20. ElasticSearch映射和相關對象
- 21. 將類對象用作映射關鍵字時的排序
- 22. 加載散列 - 對象密鑰對的映射
- 23. 手動映射JSON對象時RestKit關係不映射
- 24. OneToOne映射不設置映射對象
- 25. 搜索在散列表的鍵值對映射
- 26. 如何在Groovy中使用對象列表作爲映射關鍵字
- 27. 轉換對象陣列散列映射,由對象的屬性值索引的
- 28. 推鍵值對映射對象的JavaScript
- 29. RestKit映射錯誤「無法將對象集合映射到不可變集合。」
- 30. 映射對象列表
不要擔心這一點。 – Maroun
這是不是很清楚你想要什麼。你有特別的擔憂嗎?使用* mutable *對象作爲鍵肯定是一個壞主意 - 至少如果它們能夠以影響哈希碼的方式進行變異。 –
你試圖用什麼來實現? –