static
class
node
implements
map.entry
final node
resize()
elseif(
(newcap = oldcap <<1)
< maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr <<1;
// 雙倍擴大老記憶體和老閾值並賦給新的table
}else
if(oldthr >0)
// initial capacity was placed in threshold
newcap = oldthr;
else
if(newthr ==0)
threshold = newthr;
//把新的閾值賦給當前table
@suppresswarnings()
node
newtab =
(node
)new
node
[newcap]
;//建立容量為newcap的新table
table = newtab;
if(oldtab != null)
else
}while
((e = next)
!= null);if
(lotail != null)
if(hitail != null)}}
}}return newtab;
}
重點分析(<--------------------標誌出來的地方)
重點1
if
(e.next == null)
//將為空的元素複製到新table中 ,e.next ==null代表當前桶裡面只有乙個元素,直接把它取模放入新陣列中,它仍然是鍊錶的第乙個元素
newtab[e.hash &
(newcap -1)
]= e;
//等於是建立乙個新的空table然後重新進行元素的put,這裡的table長度是原table的兩倍
重點2
else
if(e instanceof
treenode
)//暫時沒了解紅黑樹
((treenode
)e).
split
(this
, newtab, j, oldcap)
;
重點3
else
else
}while
((e = next)
!= null);if
(lotail != null)
if(hitail != null)
}
重點4
if
((e.hash & oldcap)==0
)else
問:為什麼這裡是e.hash & oldcap 而不是和前面那種類似取模運算的 (e.hash & oldcap-1) ?
答:舉例 有乙個hashcode = 01000110,00000110,00001110 ,原陣列長度為16(1111),取模之後得到索引為1110,即14;
擴容後,hashcode & (00011111) ,結果實際看的是加粗標記的位,如果e.hash & oldcap==0,代表擴容後不需要移動;如果e.hash & oldcap == 1,則代表擴容後索引需要+擴容前陣列長度;
為什麼hashmap中要用2的次冪來算?
答:計算下標時取模運算很慢,用power of 2 可以用位與運算& 來更快優化效能。
hashmap的key可以為null/
答:可以為null,並且陣列的第乙個位置即索引為0的地方專門放null。
為什麼jdk8中樹形結構選用紅黑樹?
答:因為不僅要保證查詢效率,還要保證插入效率,選用紅黑樹是乙個折中的考慮。
只要鍊錶上的數量大於或者等於treeify_threshold,就一定會轉化為紅黑樹?
答:不一定,**裡面還有個引數min_treeify_capacity,只有總的數量大於等於min_treeify_capacity 的時候才能變樹,這也是整體上效能的考量。
為什麼在小於7,轉化為鍊錶,大於7轉化為紅黑樹。
答:首先,紅黑樹不一定查詢就比鍊錶高效,當節點很多時,紅黑樹的效率較高;選擇6和8(如果鍊錶小於等於6樹還原轉為鍊錶,大於等於8轉為樹),中間有個差值7可以有效防止鍊錶和樹頻繁轉換;容器中節點分布在hash桶中的頻率遵循泊松分布,桶的長度超過8的概率非常非常小。
HashMap JDK8 知識彙總
關於hashmap的面試題這兩篇講的不錯 關於hahmap中的變數解釋這篇講的不錯 關於hashmap為什麼不是執行緒安全這篇講的不錯 關於hash演算法講解 解決hash演算法衝突的四種方法 注意 hashmap和hashset是採用拉鍊法解決衝突的.concurrenthashmap在jdk1....
HBase內部結構
table表 就是有乙個或者多個列族組成,加上之前的 使用,這個表概念應該很熟了 row行 乙個行包括了多個列,這些列通過列族來分類 column family列族 列族是多個列的集合,hbase會盡量的將乙個列族的列放入同乙個伺服器內,這樣可以提高訪問效能,並且可以批量管理有關聯的一堆列,所有的資...
Oracle檢視內部結構
1 分析資料檔案塊,轉儲資料檔案n的塊m alter system dump datafile n block m 2 分析日誌檔案 alter system dump logfile logfilename 3 分析控制檔案的內容 alter session set events immediat...