HashMap初始化的四种构造方法

HashMap初始化的四种构造方法

一、HashMap()

使用默认初始容量16与默认负载因子0.75构造一个空的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)

传入初始容量和负载因子来构造一个空的HashMap。

static final int MAXIMUM_CAPACITY = 1 << 30;

/**
 * 当map容量达到这个阈值的时候,需要进行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;
    // 校验负载因子合法性
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal load factor: " + loadFactor);
    this.loadFactor = loadFactor;
    // 计算下次resize的阈值
    this.threshold = tableSizeFor(initialCapacity);
}

由于HashMap的容量必须为2的幂次方,且int类型的范围为-2^32 ~ 2^32-1,所以MAXIMUM_CAPACITY为int类型中为2的幂次方且最大的值。

三、HashMap(int initialCapacity)

传入初始容量,通过默认负载因子构造一个空的HashMap,调用了HashMap(int initialCapacity, float loadFactor)构造方法。

public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

四、HashMap(Map<? extends K, ? extends V> m)

根据已有的Map接口创建一个元素相同的HashMap,使用默认初始容量与默认负载因子。

public HashMap(Map<? extends K, ? extends V> m) {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    putMapEntries(m, false);
}

猜你喜欢

转载自blog.csdn.net/weixin_33720956/article/details/87240103