HashMap 与 ConcurrentHashMap
一、概述
二、HashMap
1、數據結構
2、應用
3、不要用 HashMap 做本地緩存
一般我們聲明 HashMap 時,使用的都是默認的構造方法:HashMap<K, V>,但是它還有另外一個構造方法:HashMap(int initialCapacity, float loadFactor),其中參數 initialCapaticy 為初始容量,loadFactor 為加載因子;如果在默認情況下,一個 HashMap 的容量為 16,加載因子為 0.75,那么閾值就是 12,所以在往 HashMap 中 put 的值到達 12 時,它將自動擴容兩倍,如果兩個線程同時遇到 HashMap 的大小達到 12 的倍數時,就很可能會出現在將舊的 Entry[] 轉移到一個新的 Entry[] 的過程中出現問題,從而導致最終的 HashMap 的值存儲異常。
再分析一下空間效率,拿 HashMap<Long, Long> 舉例。在 HashMap<Long, Long> 結構中,只有 Key 和 Value 所存放的兩個長整型數據是有效數據,共 16B (2 X 8B)。這兩個長整型數據包裝成 java.lang.Long 對象之后,就分別具有 8B 的 MarkWord、8B 的 Klass 指針,在加 8B 存儲數據的 long 值。在這兩個 Long 對象組成 Map.Entry 之后,又多了 16B 的對象頭,然后一個 8B 的 next 字段和 4B 的 int 型的 hash 字段,為了對齊,還必須添加 4B 的空白填充,最后還有 HashMap 中對這個 Entry 的 8B 的引用,這樣增加兩個長整型數字,實際耗費的內存為 (Long(24B)X2) + Entry(32B) + HashMap Ref(8B) = 88B,空間效率為 16B/88B = 18%,實在太低了。
三、ConcurrentHashMap
1、數據結構
2、應用
轉載于:https://www.cnblogs.com/JavaSubin/p/7751911.html
總結
以上是生活随笔為你收集整理的HashMap 与 ConcurrentHashMap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 团队随笔汇总
- 下一篇: AC自动机——Uva 11468 子串