map算子相關總結

來源:魅力女性吧 2.08W
map算子相關總結

1、map的特點:key只有一個,而一個key可以有多個value,並且key值不可以出現重複項。就好比,一個孩子只有一個親生父親,而一個父親可以派生出多個親生孩子。他繼承了AbstractMap類。

2、hashMap可以序列化(即實現了Serializable接口,推薦打開源碼看一下,141行),所以線程不安全。如果再線程中一般情況下使用ConcurrentHashMap來操作。在每一個分段上都用鎖進行保護,從而讓鎖的粒度更精細一些,併發性能更好,而 HashMap 沒有鎖機制,不是線程安全的。

3、hashMap的底層在jdk1.8之前主要是數組和鏈表組成,jdk1.8之後新增了紅黑樹的特性。數組是hashMap的主體,而鏈表是為了解決哈希衝突(下方有對hash衝突的解釋)。Map中主要是通過key的hashCode來計算hash值(查看每一個map的哈希值下方標註),然後通過hash值選擇不同的數組來存儲。

只要hashCode相同,計算出來的hash值就一樣,如果存儲對象多了,就有可能不同的對象計算出來的hash值是相同的,這就出現了所謂的hash衝突,HashMap的底層是通過鏈表來解決hash衝突的。

具體就是把相同hash值的HashMap,通過鏈表的形式進行存儲,相當於存儲的數組就是哈希表,數組的每個元素都是一個單鏈表的頭結點,鏈表是用來解決hash衝突的,如果不同的key映射到了數組的同一位置,那麼就將其放入單鏈表中。

4、插入元素的方式有jdk1.8之前的頭插法,轉換成了尾插法

5、HashMap的默認大小為16,並且一 定是2的指數,每次擴容都為old*2。

熱門標籤