HashMap初始化的四種構(gòu)造方法
一王暗、HashMap()
使用默認(rèn)初始容量16與默認(rèn)負(fù)載因子0.75構(gòu)造一個(gè)空的HashMap乐纸。
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
}
二讳癌、HashMap(int initialCapacity, float loadFactor)
傳入初始容量和負(fù)載因子來(lái)構(gòu)造一個(gè)空的HashMap廓奕。
static final int MAXIMUM_CAPACITY = 1 << 30;
/**
* 當(dāng)map容量達(dá)到這個(gè)閾值的時(shí)候,需要進(jìn)行resize宇整。
*/
int threshold;
public HashMap(int initialCapacity, float loadFactor) {
// 初始容量不能小于0
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity);
// 初始容量不能大于MAXIMUM_CAPACITY
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
// 校驗(yàn)負(fù)載因子合法性
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " + loadFactor);
this.loadFactor = loadFactor;
// 計(jì)算下次resize的閾值
this.threshold = tableSizeFor(initialCapacity);
}
由于HashMap的容量必須為2的冪次方瓶佳,且int類型的范圍為-2^32 ~ 2^32-1,所以MAXIMUM_CAPACITY為int類型中為2的冪次方且最大的值鳞青。
三为朋、HashMap(int initialCapacity)
傳入初始容量,通過(guò)默認(rèn)負(fù)載因子構(gòu)造一個(gè)空的HashMap厚脉,調(diào)用了HashMap(int initialCapacity, float loadFactor)構(gòu)造方法习寸。
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
四、HashMap(Map<? extends K, ? extends V> m)
根據(jù)已有的Map接口創(chuàng)建一個(gè)元素相同的HashMap傻工,使用默認(rèn)初始容量與默認(rèn)負(fù)載因子霞溪。
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}