前言:
HashMap的size大于等于(容量*加載因子)的時候,會觸發擴容的操作,這個是個代價不小的操作。
為什么要擴容呢?HashMap默認的容量是16,隨著元素不斷添加到HashMap里,出現hash沖突的機率就更高,那每個桶對應的鏈表就會更長,
這樣會影響查詢的性能,因為每次都需要遍歷鏈表,比較對象是否相等,一直到找到元素為止。
為了提升查詢性能,只能擴容,減少hash沖突,讓元素的key盡量均勻的分布。
擴容基本點
加載因子默認值是0.75
1
|
static final float DEFAULT_LOAD_FACTOR = 0 .75f; |
容量的默認值是16
1
|
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4 ; // 等于16 |
HashMap提供了一個構造參數,可以在創建的時候指定容量和加載因子。
1
|
public HashMap( int initialCapacity, float loadFactor) |
默認的情況下,HashMap 的size一旦大于等于16*0.75=12的話,
同時每個Entry(或者叫桶)里面至少有一個元素的時候就會進行擴容。
1
2
3
4
5
|
if ((size >= threshold) && ( null != table[bucketIndex])) { resize( 2 * table.length); hash = ( null != key) ? hash(key) : 0 ; bucketIndex = indexFor(hash, table.length); } |
擴容的時候,容器容量翻倍
1
|
resize( 2 * table.length); |
擴容的時候需要重新計算元素的數組下標
1、重新分配一個新的Entry數組
2、重新計算原來元素的在新數組中的下標(比較耗資源)
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/linsongbin1/article/details/54695986