1. 程式人生 > >HashMap相關總結

HashMap相關總結

tails 解決 解決沖突 syn ref 因子 jdk1.8 lshell 覆蓋

1.HashMap:根據鍵值hashCode值存儲數據,大多數情況下可以直接定位到它的值,但是遍歷順序不確定。所有哈希值相同的值存儲到同一個鏈表中 HashMap只允許一條記錄的值為null,允許多條記錄的值為null。 HashMap非線程安全,任意時刻可以有多個線程同時寫HashMap 為什麽HashMap不是線程安全的? 1.比如兩個線程同時使用put方法,剛好兩個put方法的hashcode值一樣,發生了碰撞,那麽會發生值的覆蓋。 2.當超過限定的threshold後,會進行rehash,所有的元素都要背重新計算一遍,這裏會產生死循環,具體參考https://coolshell.cn/articles/9606.html 如何線程安全的使用HashMap? 1.Hashtable 2.ConcurrentHashMap 3.Synchronized Map 2.Hashtable:繼承自Dictionary類,並且是線程安全的,任一時間只能有一個線程寫HashTable,並發性不如ConcurrentHashMap,ConcurrentHashMap引入了分段鎖 HashTable是線程安全的,但是效率低,HashTable使用synchronized,所以所有的線程競爭一把鎖。 ConcurrentHashMap不僅線程安全而且效率高,因為它包含了一個Segment數組,將數據分段存儲,給每一段數據配一把鎖,也就是分段鎖技術。 3.LinkedHashMap:保存了記錄的插入順序 4.TreeMap:實現了SortedMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值升序排序。 HashMap的內部實現: 1.存儲結構:數組+鏈表+紅黑樹(JDK1.8之後引入的) 2.HashMap使用哈希表存儲,哈希表為了解決沖突,采用開放地址發和鏈地址法,Java中使用鏈地址法 3.HashMap的默認構造字段 threshold //所能容納的key-value對極限 loadFactor //負載因子(默認值0.75) modCount //記錄HashMap內部結構發生變化的次數 size //實際存在的鍵值對數量 threshold=length*loadFactor-----數組定義好長度後,負載因子越大,所能容納的鍵值對個數越多 紅黑樹 http://blog.csdn.net/v_july_v/article/details/6105630 是一種二叉查找樹,每個節點增加一個存儲為表示節點顏色(紅色或黑色) 對於二叉查找樹,由n個節點隨機構造的二叉查找樹的高度為lgn,則二叉查找樹的一般操作的執行時間為O(lgn) 紅黑樹本質上是二叉查找樹,又在二叉查找樹的基礎上增加了著色和相關的性質是的紅黑樹相對平衡,從而保證了紅黑樹查找、插入和刪除的時間復雜度最壞為O(log n) 紅黑樹的5個性質: 1.每個節點或紅或黑 2.根節點是黑的 3.每個葉節點是黑的 4.如果一個節點是紅的,那麽它的兩個子節點都是黑的 5.對於任意結點,其到葉節點樹微端NIL指針的每條路徑都包含相同數目的黑節點

HashMap相關總結