最簡潔HashMap介紹

2021-08-21 07:38:01 字數 1880 閱讀 8137

一、全文介紹

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...