code我發現Hashmap的put(K key, V value)
。如果碰撞發生,此方法會替換值,但不會將Entry
添加到存儲區的LinkedList。
我在這裏失蹤了什麼?處理Hashmap中的關鍵衝突
回答
你爲什麼這麼想?相關線路如下:在內部表
計算指數:
390 int i = indexFor(hash, table.length);
遍歷鏈表在table[i]
和搜索如果該鍵已經包含:
391 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
392 Object k;
393 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
重點已經包含=>替換值...
394 V oldValue = e.value;
395 e.value = value;
396 e.recordAccess(this);
...並返回ol d值
397 return oldValue;
398 }
否則繼續循環
399 }
我們在鏈表的結束,我們還沒有找到關鍵的是,所以它不是已經包含。因此,讓我們添加一個新條目:
402 addEntry(hash, key, value, i);
線'394-396'是我的問題。它爲什麼取代舊價值? –
參見map#put的規範:「(...)如果映射先前包含該鍵的映射,則舊值由指定值替換(...)。這不是」碰撞「,因爲其他如果兩個鍵具有相同的散列碼但不相等,則在這種情況下,替換不會發生!(見第402行) – isnot2bad
如果您需要爲每個鍵保留多個值,請考慮使用List作爲值或提供MultiMap的第三方庫(例如http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html ) – isnot2bad
您不能在HashMap
中多次使用相同的密鑰。這就是爲什麼價值被取代,而不是隻是創造一個新的Map.Entry<K,V>
你是不是錯過了一件事。 Java的Map
的總體合同是每個密鑰具有單個值。 如果你想保存每個鍵的多個值,你必須使用類似Apache Commons' MultiMap的東西,或者通過擁有Map<K, List<V>>
來自己實現類似的東西。
- 1. DomainContext中的衝突處理
- 2. HashMap中的衝突解析
- 3. SDL衝突處理
- 4. 處理SVN衝突
- 5. 在CouchDB中處理衝突
- 6. wit.ai - 關鍵字衝突
- 7. Android資源關鍵衝突
- 8. AndEngine:處理衝突與TMX
- 9. $ _REQUEST密鑰衝突處理
- 10. 處理哈希衝突
- 11. 如何處理requirejs衝突
- 12. jbox2D庫處理中的衝突?
- 13. Java中的衝突解析HashMap
- 14. 在MongoMapper中衝突關鍵名稱
- 15. 如何處理Java(EE)中的衝突依賴關係
- 16. 的衝突關係和外鍵1-1
- 17. 在hashmap衝突中檢索實際值
- 18. 衝突主鍵
- 19. 如何處理合並衝突 - Git的
- 20. Rails的路線衝突處理
- 21. 如何處理衝突的鑰匙扣
- 22. 處理單引號衝突的Mysql
- 23. SPriteKit處理衝突的行爲
- 24. 處理與烏龜SVN的衝突?
- 25. HashMap的雙關鍵
- 26. Maven:如何處理衝突的依賴關係
- 27. HashMap避免衝突的Java示例
- 28. has_many_polymorphs中的衝突關聯
- 29. Eclipse中的衝突鍵盤快捷鍵
- 30. 關閉突變處理
我認爲您正在將碰撞(相同的哈希碼)與equals(實際上等效)混合在一起。 –
可能。我想看看java如何處理碰撞。 –