hashmap 的put ,get

1.put,get

添加鏈接描述

!!!!!!!:
看:--------------》

添加鏈接描述

1

map裏面的數據都是存儲在這個table裏面的,而Node<K, V>是一個鏈表.

每一個node是一個元素,元素包括key和value,都是泛型的。還有一個指向下一個node的指針,這就構成了一個鏈表。這個node裏面重寫了hashCode和equals方法
在這裏插入圖片描述

2

如果table爲空的時候,就給這個table初始化,也就是resize。這裏大致說說這個resize,如果table爲空,就將table初始化爲一個長度爲16的,負載因子爲0.75的數組。否則就初始化爲之前table長度的兩倍。這個時候這個數組的大小爲16,但是容量只有160.75=12。門限值=容量負載因子。一旦數組中的元素超過門限值,就會重新resize。

3

put之前,先計算key值的hashCode,這個hashCode是個int型的值,計算出來的這個值就是數據在數組中的索引.

「 所以,get的時候,當然也是計算key的hashCode,然後直接從數組中取出數即可。所以get的速度是很快的,沒有查找的過程,時間複雜度是O(1)。那前面說過,這個不同的key值的hashCode是可能相同的,也就是hash碰撞,那怎麼處理呢?這就是鏈表的作用了,hashCode相同的key值在數組中的索引就是一樣的。於是hashCode相同的這些值就被存放在一個鏈表上。查找的時候就循環這個鏈表進行查找。

hashMap裏面的table使用了數組+鏈表的這個結構存儲數據,put和get的時候幾乎都不需要查找(只有發生hash碰撞的時候纔會有循環(只有hash值相同但不是相同的key值纔會在一條鏈表上,然而不同key值hash相同(就是hash碰撞)),然而這種機率灰常小,所以是幾乎不用查找),時間複雜度是O(1),所以put和get的效率都非常高。直接計算hash值就能得到存儲的索引。」

4

這個hash值在數組中的位置,

1如果這個位置上的值爲空,就把值放在這裏.
2既然這個位置的數據不爲空,我新來的數據也插入在這裏,和之前的數據一起形成一個鏈表。所以我就定義一個e節點,這個e節點就是我要插入的位置,我只要找到這個e,並插入數據就完事兒:

即:

hash相同,但是不equals的數據,就循環這個鏈表,如果遇到的節點爲空,就將數據插入到這個空節點上,如果遇到的節點值equals相同(證明又遇到了key值相同的情況),又將這個節點記錄並返回。

在這裏插入圖片描述

hashMap爲什麼二倍擴容詳解

添加鏈接描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章