1、hashmap執行緒不安全,hashtable執行緒安全
2、因為執行緒安全,hashtable效率比hashmap低
3、hashtable的key和value都不能為空,hashmap只能有乙個key為null,多個value值為null
4、hashmap預設初始陣列大小是16,hashtable預設是11,hashmap擴容2倍,hashtable擴大兩倍+1
5、hashmap需要重新計算hash值,而hashtable直接使用兌現過的hashcode
hashtable直接使用的synchronized關鍵字
concurrenthashmap在jdk7中採用了segment分段鎖,在jdk8中採用了cas+synchronized,也採用了分段鎖的方式大大縮小了鎖的粒度,所有concurrenthashmap效率比hashtable高
1、concurrenthashmap是執行緒安全的
2、hashmap的key和value都可以為null,concurrenthashmap的key和value都不能為null
3、紅黑樹相關的節點類,資料結構不同
1、hashtable 使用一把鎖(鎖住整個鍊錶結構)處理併發問題,多個執行緒競爭一把鎖,容易阻塞;
2、concurrenthashmap 在jdk 1.7 中使用分段鎖(reentrantlock + segment + hashentry),相當於把乙個 hashmap 分成多個段,每段分配一把鎖,這樣支援多執行緒訪問。鎖粒度:基於 segment,包含多個 hashentry。
jdk 1.8 中使用 cas + synchronized + node + 紅黑樹。鎖粒度:node(首結點)(實現 map.entry)。鎖粒度降低了。
在1.7中,採用分段鎖機制,底層採用陣列+鍊錶結構
jdk 1.8 中,採用node + cas + synchronized來保證併發安全。取消類 segment,直接用 table 陣列儲存鍵值對;當鍊表長度》=8,鍊錶轉換為紅黑樹,提公升效能。底層變更為陣列 + 鍊錶 + 紅黑樹。當紅黑樹<=6,降級為鍊錶
1、因為jdk8對synchronized進行了大量優化,效率提公升了
2、在大量的資料操作下,對於 jvm 的記憶體壓力,基於 api 的 reentrantlock 會開銷更多的記憶體。
負數正在初始化或者擴容操作
-1正在初始化
-n代表有n-1個執行緒正在進行擴容操作
0預設值
代表還沒有被初始化
正數表示初始化大小或者map中的元素叨叨這個數量是,需要進行擴容了
node是儲存結構的基本單元,繼承 hashmap 中的 entry,用於儲存資料;
treenode繼承 node,但是資料結構換成了二叉樹結構,是紅黑樹的儲存結構,用於紅黑樹中儲存資料;
treebin是封裝 treenode 的容器,提供轉換紅黑樹的一些條件和鎖的控制。
1.如果沒有初始化,就呼叫 inittable() 方法來進行初始化;
2.如果沒有 hash 衝突就直接 cas 無鎖插入;
3.如果需要擴容,就先進行擴容;
4.如果存在 hash 衝突,就加鎖來保證執行緒安全,兩種情況:一種是鍊錶形式就直接遍歷到尾端插入,一種是紅黑樹就按照紅黑樹結構插入;
5.如果該鍊錶的數量大於閥值 8,就要先轉換成紅黑樹的結構,break 再一次進入迴圈
6.如果新增成功就呼叫 addcount() 方法統計 size,並且檢查是否需要擴容。
預設容量為 16,擴容時,容量變為原來的兩倍。
1.計算 hash 值,定位到該 table 索引位置,如果是首結點符合就返回;
2.如果遇到擴容時,會呼叫標記正在擴容結點 forwardingnode.find()方法,查詢該結點,匹配就返回;
3.以上都不符合的話,就往下遍歷結點,匹配就返回,否則最後就返回 null。
1.7中程式執行時能夠同時更新 conccurenthashmap 且不產生鎖競爭的最大執行緒數。即segment陣列的長度,預設為 16,且可以在建構函式中設定。當使用者設定併發度時,concurrenthashmap 會使用大於等於該值的最小2冪指數作為實際併發度(假如使用者設定併發度為17,實際併發度則為32)。
1.8中併發度則無太大的實際意義了,主要用處就是當設定的初始容量小於併發度,將初始容量提公升至併發度大小。
併發下的Map常見面試題彙總
q hashmap 和 hashtable 有什麼區別?a hashmap 是執行緒不安全的,hashtable 是執行緒安全的 由於執行緒安全,所以 hashtable 的效率比不上 hashmap hashmap最多隻允許一條記錄的鍵為null,允許多條記錄的值為null,而 hashtable...
常見面試題之MAP(一)
難度中等2137 給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2...
map的詳解及常見面試題
map的概念 map是stl中的乙個關聯式容器,它提供一對一的k v的資料處理能力,由於這個特性,在我們需要完成key value資料處理的時候可以很方便的呼叫。map的底層結構是紅黑樹,這棵樹對資料有自動排序的功能,所以map中的資料都是有序的,並且查詢的時間複雜度基本是logn。他的特點是增加和...