首先說一下jdk1.7版本的存放原理:
當例項化後,底層會直接建立乙個長度為16的一維陣列entry table;
然後,說一下新增元素時,呼叫put方法:(三種情況儲存)
方式一:底層根據key計算hash值,計算出索引位置,檢視當前位置是否有值,如果沒有值,直接存放。
情況二:當計算出的索引位置,有值時(可能會存在鍊錶結構),此時計算hash值是否相等,如果不等,則存放(以鍊錶形式)。
此時,存放鍊錶的形式:新新增的元素,插在此處,其他元素,下移(這是jdk1.7存放的方式)。
情況三:在情況二的基礎上,如果hash值也相同時。則判斷key的equals是否相同。如果不同,則插入當前位置(其他元素下移)。如果相同,則是替換新元素的value。
再來說一下jdk1.8版本的改動(以hashmap為例)
①當例項化hashmap時,並沒有建立長度為16的陣列。
②jdk1.8時建立的陣列名稱:node[ ],而不是entry[ ] ;
③首次新增元素(put時),才建立長度為16的陣列。
④jdk1.7的資料結構只有:陣列+鍊錶
jdk1.8的資料結構為:陣列+鍊錶+紅黑樹
⑤對④的補充:當陣列某一索引元素鍊錶個數 > 8時,並且,陣列長度 > 64,此時索引所有元素才變為紅黑樹儲存。
擴容機制:原來的2倍
預設大小:16
負載因子(填充比):0.75
吞吐臨界值(閾值,threshoold):陣列大小 * 負載因子
ArrayList底層(1 7和1 8)變化
首先說jdk1.7 當例項化arraylist時,建立長度為10的object 當add新增到11個的時候,擴容,擴容為原來的1.5倍。將原來的資料複製到新的陣列中。建議使用new arraylist int capacity 直接宣告陣列的大小 然後說一下1.8的變化 當例項化是,建立object...
HashMap 1 7和1 8的區別
底層資料結構不一樣,1.7是陣列 鍊錶,1.8則是陣列 鍊錶 紅黑樹結構 當鍊表長度大於8,轉為紅黑樹 jdk1.7用的是頭插法,而jdk1.8及之後使用的都是尾插法,那麼他們為什麼要這樣做呢?因為jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1...
HashMap 底層 原理(JDK 1 8)
原來看過1.7的hashmap底層,1.8更新後也稍微看了一下,沒有進行仔細的總結,今天總結一下1.8底層的原理。本文只討論1.8的底層原理。以下全文為1.8版本的 對於hashmap的資料結構,是老生常談了,面試的時候經常會被問道。底層資料結構為陣列 鍊錶 紅黑樹,儲存的是node節點,紅黑樹是t...