HashMap原始碼簡單分析

2022-08-18 19:45:16 字數 2566 閱讀 1039

1

還是老習慣,一邊看,一邊新增注釋,希望堅持下去,hashmap的基本原始碼進行了分析,內部一些介面和設計還沒來得及看23

一、成員

45 1、transient

entry table;

67 hashmap內部維護了乙個內部類-entry,用來存放鍵值對,這個entry實現了map.entry這一map的內部介面entry,hashmap本質上來講是由陣列和entry鍊錶組成的資料結構

89 2、 static

final

float default_load_factor = 0.75f;

1011

載入因子,載入因子越大,hash表(即entry陣列)所佔空間越少,但會影響查詢效能(因為需要通過鍊錶乙個挨乙個向下查詢),載入因子越小,hash表(即entry陣列)所佔空間越多,這時查詢效率較高,但是hash表所佔空間較多

1213 3、static

final

int default_initial_capacity = 16;

1415 4、/**

1617

* the next size value at which to resize (capacity * load factor).

18*

@serial

19*/

20int

threshold;

2122 5、static

final

int maximum_capacity = 1 << 30;

2324 6、static

final

int default_initial_capacity = 16;

2526 7、final

float

loadfactor

2728

決定什麼時候進行擴容

2930

二、方法

3132 1、核心構造方法

3334

public hashmap(int initialcapacity, float

loadfactor)

5455 2、在key物件的hashcodr()方法的基礎上再做hash,避免一些不好的hashcode()方法

5657

//null keys always map to hash 0, 如果key為null,那麼hash()方法的到的hash值為0,再呼叫indexfor方法得到的陣列的索引值也為0,所以key為null的entry存在陣列下標為0的位置

5859

static

int hash(int

h) 66

67 3、根據2中獲得的hash值和陣列的長度得到entry對應的陣列的索引

6869

static

int indexfor(int h, int

length)

7273 4、根據key獲取value

7475

public

v get(object key)

86return

null;87

}8889 5、獲取key為null的key對應的值(注意:這裡使用在鍊錶中查詢的方式,因為index為0的鍊錶上不是只有key為null的entry)

9091

private

v getfornullkey()

96return

null;97

}9899 6、新增鍵值對

100101

public

v put(k key, v value)

116}

117118

/*如果key不存在則新增鍵值對

*/119

120 modcount++;

121addentry(hash, key, value, i);

122return

null

;123

}124

125 7、新增加鍵值對

126127

void addentry(int hash, k key, v value, int

bucketindex)

133134 8、擴容

135136

void resize(int

newcapacity)

143144 entry newtable = new entry[newcapacity];  //

擴容為新capacity

145 transfer(newtable);  //

將所有的entry遷移到新的陣列中去

146 table =newtable;

147 threshold = (int)(newcapacity * loadfactor);  //

重新計算閾值

148}

149150 9、將所有entry遷移到新陣列中

151152

void

transfer(entry newtable) while (e != null

);170

}171

}172 }

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