一、全文介紹
1、hashmap資料結構介紹
2、資料的插入過程以及查詢過程
3、hashmap初始大小計算以及重要屬性介紹
4、常會被問到的問題。
二、hashmap資料結構
hashmap是由陣列和鍊錶結構組成。這種結構有兩個好處:1、查詢比純鍊錶快,插入刪除比純陣列快;2、可以解決hashcode衝突。
三、資料的插入過程以及查詢過程(jdk1.7)
1、插入資料過程文字描述
1.1、判斷儲存table是否為空,如果為空初始化,然後判斷key是否為空,如果為空判斷table[0]是否有值,無值插入
資料,有值替換value。
1.2、key不為空,則根據key計算陣列中的index(先計算key的hash值,然後與table的表的長度減1做與運算)。
1.3、找陣列中對應位置有沒有儲存資料,如果沒有存入,如果有遍歷陣列上的所有資料,檢視有沒有資料hash值相
等key相等的。如果有則替換。
1.4、如果沒有找到則新增資料,首先會檢視是否需要增容,如果需要增容,並且重新計算index值,如果不需要的話
生成乙個實體,並且存放在表頭。
2、插入資料過程流程圖描述(為了避免流程圖過於複雜去除了key為null的過程)
hashmap插入過程.png
3、獲取資料的過程文字描述
3.1、判斷key是否為空,為空時檢視table[0]是否有entry,有則返回,沒有則返會null
3.2 、key不為空,根據key計算相應的index 值,遍歷相應的鍊錶找到key相等的entry返回
4、獲取資料流程圖(較為簡單,省略)
四、hashmap初始大小以及重要成員變數介紹
1、重要屬性
int threshold; // table所能容納的key-value對極限 (table.length(陣列)*loadfactor)
final float loadfactor; // 負載因子(1個係數可以大於1)
int modcount; //hashmap內部結構發生變化的次數,替換不增加
int size; //實際存在的鍵值對數量
2、常見引數初始大小
table長度初始大小16
loadfactor負載因子為0.75
五、常被問到的問題
1、為什麼table的長度通常為2的倍數
為2的倍數與index的計算有關,能夠減少index的衝突。
table 長度為2的倍數那 長度減1 後用二進位制表示就全為1;這樣做與運算取決於hashcode的後幾位
table length 為16
0100 &1111=4
0110&1111=6
0111&1111=7
table length 為6
0100&0101=4
0110&0101=4
0111&0101=5
2、怎麼擴容
2.1、新申請兩倍的陣列大小
2.2、重新計算index,並放入新的陣列中
3、假設hashcode衝突,100個資料需要將hashmap初始為多大比較合適
這個主要考慮table的長度和負載因子及擴容
table長度為2的倍數,那128比較合適但128*0.75=96。小於100因此還是需要擴容。所以應該取256。
4、key值和value值是否可以為null
key和value值都可以為null
最簡潔SparseArray介紹
一 全文概括 1 sparsearray資料結構 2 資料插入以及取出過程 3 常見問題 二 sparsearray資料結構 1 由兩個陣列組成,乙個用於儲存key,乙個用於儲存value。儲存key的陣列為int型,儲存value的陣列為物件型別 2 key在陣列中的index就是value在相應...
最簡單的HashMap底層原理介紹
hashmap 底層原理 在jdk1.7中hashmap採用的是 陣列array 和 鍊錶link 這兩種資料結構,而在jdk1.8中對底層實現進行了優化,開始採用陣列鍊錶和紅黑樹.在1.7的基礎上對hash演算法進行了改進,並增加鍊錶儲存閾值為8.當鍊表長度大於8時,轉換為紅黑樹儲存 陣列長度為偶...
最簡潔條件判斷寫法
def islen strstring if len strstring 6 return true else return false在python3中有辦法只用一行完成函式 def islen strstring return true if len strstring 6 else false...