有時(shí)候我們需要一個(gè)只放一個(gè)元素的Map。
可能一開始是這樣的
var map = new HashMap<String, Object>(1);
上面這種寫法相當(dāng)于
var map = new HashMap<String, Object>(1, 0.75f);
這樣會(huì)導(dǎo)致什么呢?
我們知道 threshold = capacity * loadFactor
看HashMap中的resize方法的這段代碼
if (newThr == 0) {
float ft = (float)newCap * loadFactor;
newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
(int)ft : Integer.MAX_VALUE);
}
threshold = newThr;
所以上面這種寫法,在putVal開始的時(shí)候會(huì)調(diào)用resize(),導(dǎo)致threshold ==0(1*0.75強(qiáng)轉(zhuǎn)int),然后在putVal的結(jié)束的時(shí)候
if (++size > threshold)
resize();
1 > 0 ,所以會(huì)再次調(diào)用resize(),這樣Map的這個(gè)table長(zhǎng)度就變成2了,但是Map此時(shí)是只有一個(gè)元素的
但是,用這種方式就沒(méi)問(wèn)題了
var map = new HashMap<String, Object>(1, 1.f);
當(dāng)然,有時(shí)候可以用Collections.singletonMap(一個(gè)不可變的Map,只包含一個(gè)Key和一個(gè)Value)