initialcapacity 預設初始容量 值為16,最大容量值為2^30
loadfactor 預設載入因子 值為0.75f
threshold 閾值 預設值為16 *0.75 ,即容量*載入因子
這兩個引數是影響hashmap效能的重要引數,其中容量表示雜湊表中桶的數量,初始容量是建立雜湊表時的容量,
載入因子是雜湊表在其容量自動增加之前可以達到多滿的一種尺度,它衡量的是乙個雜湊表的空間的使用程度,載入因子越大表示雜湊表的裝填程度越高,反之愈小。
如果載入因子越大,對空間的利用更充分,然而後果是查詢效率的降低;如果載入因子太小,那麼雜湊表的資料將過於稀疏,對空間造成嚴重浪費。系統預設負載因子為0.75,一般情況下無需修改。
在jdk1.7中,hashmap的底層建立的是entry陣列,在例項化後,底層就建立了乙個長度為16的entry陣列,此時的底層結構是陣列+鍊錶;在jdk1.8中,底層建立的是node陣列,底層在一開始並不會建立陣列,在第一次呼叫put方法時,底層才會建立乙個長度為16的node陣列,此時的底層結構是陣列+鍊錶+紅黑樹。
hashmap使用的是懶載入,構造完hashmap物件後,只要不進行put 方法插入元素,hashmap並不會去初始化或者擴容table。
當首次呼叫put方法時,hashmap會發現table為空然後呼叫resize方法進行初始化。
public v put(k key, v value)
final v putval(int hash, k key, v value, boolean onlyifabsent,
boolean evict)
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;}}
v oldvalue = e.value;
if (!onlyifabsent || oldvalue == null)
e.value = value;
afternodeaccess(e);
return oldvalue;}}
++modcount;
if (++size > threshold)
resize();
afternodeinsertion(evict);
return null;
}
當新增完元素後,如果hashmap發現size(元素總數)大於threshold(閾值),則會呼叫resize方法進行擴容,然後把擴容後的陣列放到新的陣列中去。
若threshold(閾值)不為空,table的首次初始化大小為閾值,否則初始化為預設值大小16。
當table需要擴容時,擴容後的table大小變為原來的兩倍,接下來就是進行擴容後table的調整:
假設擴容前的table大小為2的n次方,有put方法可知,元素的table索引為其hash值的後n位確定
那麼擴容後的table大小即為2的n+1次方,則其中元素的table索引為其hash值的後n+1位確定,比原來多了一位
因此,table中的元素只有兩種情況:
元素hash值第n+1位為0:不需要進行位置調整
元素hash值第n+1位為1:調整至原索引的兩倍位置
在resize方法中,第45行的判斷即用於確定元素hashi值第n+1位是否為0:
擴容或初始化完成後,resize方法返回新的table。
final node resize()
else if ((newcap = oldcap << 1) < maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr << 1; // double threshold
}else if (oldthr > 0) // initial capacity was placed in threshold
newcap = oldthr;
else
if (newthr == 0)
threshold = newthr;
@suppresswarnings()
node newtab = (node)new node[newcap];
table = newtab;
if (oldtab != null)
else
} while ((e = next) != null);
if (lotail != null)
if (hitail != null) }}
}}
return newtab;
}
HashMap底層實現原理 擴容機制
hashmap基於map介面實現,元素以鍵值對的方式儲存,並且允許使用null 建和null 值,因為key不允許重複,因此只能有乙個鍵為null,另外hashmap不能保證放入元素的順序,它是無序的,和放入的順序並不能相同。hashmap的容量,預設是16 the default initial ...
HashMap底層原理
1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...
HashMap底層原理
hashmap實現map介面,非執行緒安全的,區別於concurrenthashmap。允許使用null值和null鍵,不保證對映的順序.底層資料結構是乙個 陣列 鍊錶 紅黑樹 put 根據key計算得到key.hash h k.hashcode h 16 根據key.hash計算得到桶陣列的索引i...