1. 程式人生 > 其它 >java HashMap原始碼解析

java HashMap原始碼解析

/**
* The default initial capacity - MUST be a power of two.
*/
DEFAULT_INITIAL_CAPACITY :
是指HashMap容器的初始大小,MUST be a power of two意思是必須是2的冪次方,二進位制格式中,1向左移動4位,
也就是0001 --> 1 0000,即2^4=16。為什麼初始容量是16而不是4,8或其他呢?因為16的索引是0~15,在JDK中,
都是用2進位制的10進位制數%16,結果在0~15之間。HashMap通過key的hashcode值,來進行位運算,在2的冪次方的情
況下,length-1的所有二進位制位全是1,hashCode碼&(length - 1)的結果取決於hashCode本身,如果hashCode是均
勻的,就可以減少hash碰撞情況(一個hash對應多個字串),同時彙編處理的進位制都是16進位制,Java的底層是C,C
的底層是彙編,越接近底層開發效率越快,所以初始容量是16位

MAXIMUM_CAPACITY:
是指容量的極限值,預設設定為2^31

DEFAULT_LOAD_FACTOR:
是指負載因子,預設為0.75f。負載因子的存在是非常重要的,由於初始化HashMap的容量大小是固定的,當儲存的資料
超過最大值*負載因子,即16*0.75=12並且這個位置已經有別的資料存在,將在當前容量的基礎上進行擴容(如果沒有別
的資料是個空位就不會擴容)。JDK1.7版本是使用了rehash方法,建立新的連結串列,如果在新連結串列的陣列索引位置相同,則
連結串列元素會倒置。而JDK1.8版本中,連結串列元素相對位置沒有變化, 實際是對物件的記憶體地址進行操作。

TREEIFY_THRESHOLD :
是指節點數,當一個元素被新增到至少有8(預設值)個節點的桶中時,桶中連結串列結構將轉化為樹形結構(紅黑樹)

UNTREEIFY_THRESHOLD:
也是指節點數,不過是樹形結構轉換為連結串列結構

MIN_TREEIFY_CAPACITY:
是指當桶被轉化為樹形結構的時候,此時桶所擁有的最小容量