HashMap原始碼分析(1 7 0 80)

2021-08-08 21:02:31 字數 3173 閱讀 2924

首先貼上jdk中的注釋,由谷歌翻譯,已經基本講解了hashmap的功能和要點:

基於雜湊表的實現map 。實現提供了所有可選 null值和null 鍵。大致相當於hashtable除了它不同步並允許null。此類不保證map的順序;特別是它並不保證訂單隨著時間的推移將保持不變。假設雜湊函式將元素適當地分散在桶中。迭代結束收集檢視需要時間與「能力」成正比 hashmap例項(桶數)加上它的大小(數字)鍵值對映)。因此,不要設定初始化是非常重要的容量太高(或負載因子太低).hashmap 的乙個例項有兩個影響它的引數效能初始容量和負載因子。該容量是雜湊表中的桶數,也是初始值容量只是建立雜湊表時的容量。該負載因子是衡量雜湊表的允許範圍在其容量自動增加之前。當數量雜湊表中的條目超過了負載因子和的乘積當前容量,雜湊表是rehashed 即內部資料結構重建),使雜湊表大約有兩倍桶數。作為一般規則,預設負載因子(.75)提供了乙個很好的權衡時間和空間成本之間。更高的值會降低空間開銷

但是增加查詢成本(反映在大部分操作中) hashmap 類,包括get 和 put 。該

應考慮地圖中預期的條目數及其載入係數在設定其初始容量時考慮到,以便最小化

rehash運算元。如果初始容量較大比最大條目數除以負載因子,否則不會發生重播操作。

如果許多對映要儲存在乙個hashmap例項中,以足夠大的容量建立它將允許對映

比使其執行自動重新排序更有效地儲存需要增長桌子。

請注意,此實現未同步

如果多個執行緒同時訪問雜湊對映,並且至少有乙個執行緒在結構上修改地圖,它必須

外部同步(結構修改是任何操作新增或刪除乙個或多個對映;只是改變價值與例項已經包含的金鑰相關聯的不是結構修改。)這通常是由…完成的自動封裝地圖的某些物件進行同步。如果沒有這樣的物件存在,地圖應該使用「包裝」

方法。這最好在創作時完成,以防意外

對地圖的不同步訪問:

map m = collections.synchronizedmap(new hashmap(…));所有這個類的「集合檢視方法」返回的迭代器是 fail-fast :如果地圖在以後的任何時間結構上被修改迭代器是以任何方式建立的,除了通過迭代器本身刪除方法,迭代器將丟擲乙個

concurrentmodificationexception。因此,面對併發修改,迭代器失敗快速,乾淨,而不是冒險任意,非確定性的行為在不確定的時間內未來。迭代器的故障快速行為

應僅用於檢測錯誤。

public

class

hashmap

extends

abstractmap

implements

map, cloneable, serializable

abstractmap:map的基本實現

//預設容量16,必須為2的冪

static

final

int default_initial_capacity = 1

<< 4; // aka

//最大值

static

final

int maximum_capacity = 1

<< 30;

//預設負載因子

static

final

float default_load_factor = 0.75f;

//預設實現,由此可知hashmap是有陣列構成其中的物件為entry<?,?>

static

final hashmap.entry<?,?> empty_table = {};

//底部陣列

transient hashmap.entry table = (hashmap.entry) empty_table;

//entry的數量

transient

int size;

//重新調整陣列的大小,即預設16*0.75=12,當個數大於12時調整的大小

int threshold;

//負載因子

final

float loadfactor;

//修改次數,用以判斷是否同步修改集合

transient

int modcount;

//static

final

int alternative_hashing_threshold_default = integer.max_value;

//hash值

transient

int hashseed = 0;

//傳入陣列大小,負載因子

public

hashmap(int initialcapacity, float loadfactor)

//預設大小為16,負載因子0.75,實際容量12

public

hashmap()

//自定義大小,負載因子0.75

public

hashmap(int initialcapacity)

//構建m

public

hashmap(map<? extends k, ? extends v> m)

private

static

introunduptopowerof2(int number)

private

void

inflatetable(int tosize)

public v get(object key) 

private v getfornullkey()

for (hashmap.entrye = table[0]; e != null; e = e.next)

return

null;

}final hashmap.entrygetentry(object key)

int hash = (key == null) ? 0 : hash(key);

for (hashmap.entrye = table[indexfor(hash, table.length)];

e != null;

e = e.next)

return

null;

}

這裡寫**片

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

HashMap原始碼分析

public v put k key,v value if key null return putfornullkey value int hash hash key int i indexfor hash,table.length for entrye table i e null e e.nex...