一直知道HashMap有默認的容量和加載因子,今天想看看源代碼,希望能了解的更清楚一些。
我們先看看默認的構(gòu)造器吧,以下為我本機的JDK6.0的源代碼.
歡迎訪問老紫竹的網(wǎng)站(http://www.java2000.net)和我在CSDN的博客(http://blog.csdn.net/java
/**
*?默認的初始化的容量,必須是2的冪次數(shù)
*?The?default?initial?capacity?-?MUST?be?a?power?of?two.
*/
staticfinalintDEFAULT_INITIAL_CAPACITY?=16;
/**
*?默認的加載因子
*/
staticfinalfloatDEFAULT_LOAD_FACTOR?=0.75f;
/**
*?下一個需要重新分配的尺寸值。等于容量乘以加載因子。
*?也就是說,一旦容量到了這個數(shù)值,將重新分配容器的尺寸。
*?The?next?size?value?at?which?to?resize?(capacity?*?load?factor).
*?@serial
*/
intthreshold;
publicHashMap()?{
this.loadFactor?=?DEFAULT_LOAD_FACTOR;
threshold?=?(int)(DEFAULT_INITIAL_CAPACITY?*?DEFAULT_LOAD_FACTOR);
table?=newEntry[DEFAULT_INITIAL_CAPACITY];
init();
}
歡迎訪問老紫竹的網(wǎng)站(http://www.java2000.net)和我在CSDN的博客(http://blog.csdn.net/java
從代碼可以看出,默認的容量是16,而 threshold是16*0.75 = 12;
我們來看看增加的部分代碼。
publicV?put(K?key,?V?value)?{
//?我們忽略掉這部分的代碼,只看我們這里最關(guān)心的部分
addEntry(hash,?key,?value,?i);//?這里增加了一個Entry,我們看看代碼
returnnull;
}
voidaddEntry(inthash,?K?key,?V?value,intbucketIndex)?{
Entry?e?=?table[bucketIndex];
table[bucketIndex]?=newEntry(hash,?key,?value,?e);
if(size++?>=?threshold)//?這里是關(guān)鍵,一旦大于等于threshold的數(shù)值
resize(2*?table.length);//?將會引起容量2倍的擴大
}
voidresize(intnewCapacity)?{
Entry[]?oldTable?=?table;
intoldCapacity?=?oldTable.length;
if(oldCapacity?==?MAXIMUM_CAPACITY)?{
threshold?=?Integer.MAX_VALUE;
return;
}
Entry[]?newTable?=newEntry[newCapacity];//?新的容器空間
transfer(newTable);//?復(fù)制數(shù)據(jù)過去
table?=?newTable;
threshold?=?(int)(newCapacity?*?loadFactor);//?重新計算threshold的值
}
好了,我想我們已經(jīng)清楚大部分了。
其中有一點,起始容量必須是2的冪次,這如何保證呢?我們來看看其構(gòu)造方法
publicHashMap(intinitialCapacity,floatloadFactor)?{
//?忽略掉一部分代碼....
//?Find?a?power?of?2?>=?initialCapacity
//?重新查找不比指定數(shù)值大的最大的2的冪次數(shù)
intcapacity?=1;
while(capacity?<?initialCapacity)
capacity?<<=1;
//?其它的初始化代碼?...
}
好了,關(guān)于起始容量和加載因子的探討我們就到這里了。我們應(yīng)該有了一定的了解了。
總結(jié):
相對準確的估算數(shù)據(jù)量,將極大的影響HashMap的性能,因為resize是一個重新分配的過程,耗時應(yīng)該是里面最大的。
加載因子較小,會有更多的空間空閑,我不知道這個0.75是不是一個折中方案。也許0.9也是一個不錯的選擇,特別是那些數(shù)據(jù)量雖然很大,但不是經(jīng)常變化的地方,比如公司人員,城市列表等相對比較固定的數(shù)據(jù)