HashMap原始碼分析與實現

2021-09-13 22:40:19 字數 2025 閱讀 8181

hash雜湊將乙個任意的長度通過某種(hash函式演算法)演算法轉換成乙個固定的值。移位

map:地圖 x,y儲存

總結:通過hash出來的乙個值,然後通過這個值定位到map然後把value儲存到這個map中。

/**

* 初始化容量,1左移4位 16容量

*/static

final

int default_initial_capacity =

1<<4;

// aka 16

/*** 最大的容量,1左移30位 1的三十次方

*/static

final

int maximum_capacity =

1<<30;

/*** the load factor used when none specified in constructor.

* 初始化容器default_load_factor

* 載入因子係數

* 1分成四等分 0.25*3 在容量的3/4(0.75)的時候擴容

*/static

final

float default_load_factor =

0.75f

;

1、key是否可以為空、null?答案:可以

2、key是否可以重複

public v put

(k key, v value)

final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

break

; p = e;}}

if(e != null)

}++modcount;if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

3、hashmap什麼時候做擴容的?put的時候,達到3/4的時候開始擴容,按照2的倍數做擴容,一定是偶數

4、hahmap table:陣列+鍊錶的資料結構

1、初始化引數介紹

2、put方法

3、get方法

4、hash重複

每一組hashmap的資料都會存在node物件中

static

class

node

implements

map.entry

public

final k getkey()

public

final v getvalue()

public

final string tostring()

public

final

inthashcode()

public

final v setvalue

(v newvalue)

public

final

boolean

equals

(object o)

return

false;}

}

1、伸縮性:每當hashmap擴容的時候需要重新去add entry物件,需要重新hash。然後放入我們新的entry table 陣列裡面。如果在工作中知道hashmap需要存多少值,最好先指定他們擴容的大小,防止在put的時候再進行擴容很多次

2、時間複雜度:hash演算法決定了你的效率

HashMap實現原理,原始碼分析

一 原始碼分析 定義陣列的初始容量。static final int default initial capacity 1 4 aka 16 定義陣列最大容量 static final int maximum capacity 1 30 定義負載因子預設值 static final float de...

HashMap原始碼分析

public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...

HashMap 原始碼分析

1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...