有誰知道爲什麼選擇通過LinkedList而不是另一個Hashmap實現HashMap的桶。看起來如果桶自己變成了HashMap,那麼包含或者得到的就是O(1)而不是O(1)。爲什麼LinkedList作爲HashMap的存儲桶實現而不是另一個Hashmap?
回答
想象一下,使用HashMap實現存儲桶,然後發生大量衝突。一個好的散列函數應該儘量消除衝突,但我們正在考慮大量的元素。碰撞現在將存儲在存儲區的HashMap實現中。這個HashMap應該有空間來容納它自己的桶。如果存在如此大量的元素,那麼這個HashMap在它的桶中也會發生多次碰撞呢?即使有一個非常好的散列函數,在某個地方,存儲桶HashMap(例如說B)的桶將開始干擾具有多個桶的HashMap A的桶,其中一個由B實現。
LinkedList不會有這個問題。另外請記住,一旦一個桶被分配給一個HashMap,它就會被阻塞到外面 - 即使它是空的。 LinkedList將動態增長,並且不需要比條目數更多的內存。
總而言之,你當然可以實現你想要的任何東西。你可以使用ArrayList或者只是一個數組。但他們也有自己的問題(刪除導致O(n)調整時間複雜度,數組必須具有固定的大小)。所以考慮到所有的權衡,LinkedList被認爲是最好的選擇。
如果HashMaps在另一個HashMap中作爲存儲桶實現,它仍然會被攤銷O(1)。假設兩個字符串被散列到HashMap的內部數據結構中的相同索引。如果該索引包含另一個HashMap,則這兩個字符串將再次散列到相同索引,但在HashMap存儲區以及中。那麼你將不得不決定如何處理HashMap中的衝突。因此,使用HashMaps實現HashMap作爲桶會產生兩個碰撞而不是一個碰撞。另外,HashMaps比LinkedLists對一組給定的數據使用更多的內存。它們需要比數據條目更多的內存插槽來保證O(1)運行時間的分期。
是的,LinkedLists對於存儲桶並不理想,因爲它需要O(n)次的桶大小來檢索正確的值。 LinkedList存儲桶不應該變得非常大,因爲HashMap應該足夠大,以至於碰撞的頻率是最小的。
- 1. 什麼類型是HashMap存儲桶
- 2. 爲什麼HashSet的作爲HashMap的內部實現
- 3. 實現一個HashMap
- 4. 使用HashMap作爲另一個HashMap的關鍵字
- 5. 操作ArrayList存儲爲HashMap中的值
- 6. HashMap存儲桶中的條目數
- 7. 爲什麼LinkedList addLast實現工作?
- 8. scala.collection.mutable中的HashMap是不變的,但不可變.HashMap是協變的,爲什麼?
- 9. 作爲程序迭代存儲hashmap值
- 10. Java HashMap重複存儲桶條目
- 11. 想要存儲一個HashMap?
- 12. 添加一個HashMap作爲一個值的HashMap
- 13. 在HashMap中存儲HashMap
- 14. 爲什麼我的hashmap是空的Android?
- 15. 爲什麼映射助手擴展hashmap會有用?爲什麼不使用hashmap?
- 16. 爲什麼我在Firebase-RealDatabase上獲取ArrayList而不是HashMap?
- 17. 爲什麼HashMap使用TreeNode而不是Comparable鍵?
- 18. HashMap而不是DTO?
- 19. 爲什麼我的HashMap實現比JDK慢10倍?
- 20. 爲什麼HashSet實現中的HashMap瞬態?
- 21. 爲什麼HashMap <String,Object>不接受HashMap <String,List>實例?
- 22. 多個HashMap的實現
- 23. 爲什麼在LinkedHashMap中迭代通過桶比HashMap快?
- 24. 爲什麼結合兩個hashMap的結果不是corecct?
- 25. 爲什麼一個ko.mapping.fromJS工作而另一個不是?
- 26. Rails - 爲什麼一個人工作,而不是另一個?
- 27. Object的LinkedList和HashMap的LinkedList的區別?
- 28. HashMap的實現:--- hashcode
- 29. KeyStroke類作爲HashMap中的一個鍵
- 30. 爲什麼HashMap在擴展AbstractMap時實現Map?
通常取決於應用程序。一般來說,對於任何類型的隨機訪問,LinkedList都是一個可怕的想法;在按順序遍歷列表元素時,只能利用其性能增益。 –