HashMap原始碼閱讀

2021-07-27 07:05:56 字數 2732 閱讀 1677

/**

* 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 higher value is implicitly specified

* by either of the constructors with arguments.

* must be a power of two <= 1<<30.

* 最大容量2的30次方

*/static

final

int maximum_capacity = 1

<< 30;

/*** the load factor used when none specified in constructor.

* 預設負載因子,預設的擴容標準,超過總容量的3/4開始擴容

*/static

final

float default_load_factor = 0.75f;

/*** the table, resized as necessary. length must always be a power of two.

* 陣列的個數,長度同樣必須是2的n次方

*/transient entry table;

/*** map中所有元素的個數

*/transient

int size;

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

* 下一次rehash的閥值

*@serial

*/int threshold;

/*** the load factor for the hash table.

*負載因子,預設為0.75

*@serial

*/final

float loadfactor;

/*** the number of times this hashmap has been structurally modified

* the hashmap or otherwise modify its internal structure (e.g.,rehash).

* this field is used to make iterators on collection-views of

* the hashmap fail-fast. (see concurrentmodificationexception).

* hashmap被修改的次數

* 此處的修改是指元素個數的修改,或者是指修改內部結構例如:rehash

* 該屬性主要用於迭代器的快速失敗判斷

*/transient

volatile

int modcount;

/**

* 指定初始容量和負載因子

*/public

hashmap(int initialcapacity, float loadfactor)

/*** 指定初始容量

*/public

hashmap(int initialcapacity)

/**

* 向map中新增新entry

* 步驟:

* 1)hashmap可以新增null的key,key==null的entry只會放在table[0]中,但是table[0]不僅僅可以存放key==null的entry

* 1.1、遍歷table[0]中的entry鏈,若有key==null的值就用新值覆蓋舊值,並返回舊值value,

* 1.2、若無,執行addentry方法,用新的entry替換掉原來舊的entry賦值給table[0],而舊的entry作為新的entry的next,執行結束後,返回null

* 2)新增key!=null的entry時,

* 2.1、先計算key.hashcode()的hash值,

* 2.2、然後計算出將要放入的table的下標i,

* 2.3、之後遍歷table[i]中的entry鏈,若有相同key的值就用新值覆蓋舊值,並返回舊值value,

* 2.4、若無,執行addentry方法,用新的entry替換掉原來舊的entry賦值給table[i],而舊的entry作為新的entry的next,執行結束後,返回null

*/public v put(k key, v value)

}modcount++;

addentry(hash, key, value, i);//增加乙個新的entry到table[i]

return

null;//如果沒有與傳入的key相等的entry,就返回null

}

/**

* 增加null的key到table[0]

*/private v putfornullkey(v value)

}modcount++;

addentry(0, null, value, 0);//將新節點entry加入到entry中

return

null;

}

原始碼閱讀 HashMap

資料結構 jdk1.8對hashmap進行了比較大的優化,底層由以前的陣列 鍊錶變成了陣列 鍊錶 紅黑樹的實現形式,當鏈結結點較少時用鍊錶,當鏈結結點超過一定值的時候用紅黑樹。繼承實現 屬性 預設容量 static final int default initial capacity 16 最大容量...

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