hashmap原始碼理解

2021-10-09 12:16:51 字數 2392 閱讀 1652

在jdk1.8之前是資料+鍊錶方式存`在這裡插入**片`儲,從jdk、1,.8開始以資料+鍊錶+紅黑樹方式儲存,

具體的儲存方式時根據key來hash碰撞計算key的hash值,來找到對應的陣列中的下標,在判斷鍊錶的next儲存,當單個鍊錶多於8個,並且總的數多於64是啟動resize從新排序,此時才加入紅黑樹

// hashmap的初始化的方式,注意的是這裡的初始化是不會建立物件的,只是設定了初始化因子

// 包含初始化容量和初始化因子

public

hashmap

(int initialcapacity,

float loadfactor)

// 2.值設定初始化容量

public

hashmap

(int initialcapacity)

// 採用預設的初始化,容量為16.載入因子為0.75

public

hashmap()

// 採用基礎的方式賦初值

public

hashmap

(map<

?extendsk,

?extends

v> m)

// resize衝原始碼的注釋上可以了解到此方法不僅僅用來擴大空間,還用來初始化

final node

resize()

// 擴容,這裡採用的是左移1位,即擴大1倍的方式,這是計算機友好的方式買這種效率比較高

elseif(

(newcap = oldcap <<1)

< maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr <<1;

// double threshold

}else

if(oldthr >0)

// initial capacity was placed in threshold

newcap = oldthr;

else

if(newthr ==0)

threshold = newthr;

@suppresswarnings()

node

newtab =

(node

)new

node

[newcap]

; table = newtab;

if(oldtab != null)

else

}while

((e = next)

!= null);if

(lotail != null)

if(hitail != null)}}

}}return newtab;

}

// hashmap的移除

public v remove

(object key)

final node

removenode

(int hash, object key, object value,

boolean matchvalue,

boolean movable)

p = e;

}while

((e = e.next)

!= null);}

}if(node != null &&

(!matchvalue ||

(v = node.value)

== value ||

(value != null && value.

equals

(v))))

}return null;

}// 清空map集合

public

void

clear()

}

// map的對映,值對映可以值

public set

keyset()

return ks;

}// values的對映

public collection

values()

return vs;

}// 乙個鍵值對的對映,可以把entry理解為set中的元素

public set

>

entryset()

***注意:***map集合不可以在迴圈中增刪集合元素,但是在迭代器中可以使用迭代器的刪除, *延伸:*hashmap是排序的,也是有一定順序的,他是按照key的hash碰撞計算輸出的

有序是指輸出順序是按照插入順序輸出的,

排序是指按照一定順序排序的

無序是指插入的順序和儲存的順序不一致

HashMap原始碼理解

map子類常用有 hashmap 無序 和treemap 有序 hashmap hashmap的特點 無序 hash 執行緒不安全,陣列 鍊錶實現 對應的hashtable加了同步鎖 synchronized同步鎖 執行緒安全 hashmap底層是 陣列 鍊錶實現的,陣列下下標存放的是hashcod...

HashMap原始碼系列 HashMap的屬性

public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...

HashMap原始碼解讀

一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...