原始碼閱讀 HashMap

2021-09-05 09:51:46 字數 1660 閱讀 5110

資料結構

jdk1.8對hashmap進行了比較大的優化,底層由以前的陣列+鍊錶變成了陣列+鍊錶+紅黑樹的實現形式,當鏈結結點較少時用鍊錶,當鏈結結點超過一定值的時候用紅黑樹。

繼承實現

屬性

//預設容量

static final int default_initial_capacity = 16;

//最大容量

static final int maximum_capacity = 1073741824;

//預設載入因子

static final float default_load_factor = 0.75f;

//鍊錶轉化為紅黑樹的閥值

static final int treeify_threshold = 8;

//存放元素的實際陣列

transient hashmap.node table;

transient set> entryset;

//實際儲存的key-value數量

transient int size;

//修改次數

transient int modcount;

//[略]擴容參考值

int threshold;

//負載因子

final float loadfactor;

構造方法

/**

initialcapacity:預設大小16

loadfactor:預設0.75

*/public hashmap(int var1)

public hashmap()

public hashmap(map extends k, ? extends v> var1)

public hashmap(int initialcapacity, float loadfactor)

核心方法

public v put(k var1, v var2) 

public setkeyset()

public v replace(k var1, v var2)

總結

1.hashmap結合了陣列和鍊錶的優點,使用hash演算法加快訪問速度,使用雜湊表解決碰撞衝突的問題,其中陣列的每個元素是單鏈表的頭結點,鍊錶是用來解決衝突的

2.hashmap有兩個重要的引數:初始容量和載入因子。這兩個引數極大的影響了hashmap的效能。初始容量是hash陣列的長度,當前載入因子=當前hash陣列元素/hash陣列長度,最大載入因子為最大能容納的陣列元素個數(預設最大載入因子為0.75),當hash陣列中的元素個數超出了最大載入因子和容量的乘積時,要對hashmap進行擴容,擴容過程存在於hashmap的put方法中,擴容過程始終以2次方增長。

3.hashmap是泛型類,key和value可以為任何型別,包括null型別。key為null的鍵值對永遠都放在以table[0]為頭結點的鍊錶中,當然不一定是存放在頭結點table[0]中。

HashMap原始碼閱讀

the default initial capacity must be a power of two.預設容量必須是2的n次方,預設大小為16 static final int default initial capacity 16 the maximum capacity,used if a h...

HashMap原始碼閱讀

繼承樹 注意下方的 元素 二字 按照習慣,先看建構函式和第一次新增 首先無參的建構函式 讓過載因子等於0.75 public hashmap 然後是put函式,呼叫了內部的putval函式 public v put k key,v value 在看這個方法之前,要先知道hashmap中儲存元素的型別...

HashMap 1 8 原始碼閱讀

一 初始化 1.無參建構函式 負載因子預設值 static final float default load factor 0.75f 指定loadfactor負載因子的值是0.75f public hashmap 2.指定初始化大小和負載因子 hashmap的最大容量 static final i...