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