HashMap源码–(二)构造器
HashMap有4个构造器,主要分为两种,一种是创建空元素的HashMap,一种是传入一个Map,将Map中的元素复制成一个新的HashMap。
无论是哪个构造器都需要先给容量、加载因子和Entry数组。
1、指定容量和加载因子HashMap(int initialCapacity, float loadFactor)
/**
* 指定容量和加载因子的空元素构造器
*
* @param initialCapacity 容量
* @param loadFactor 加载因子
* @throws IllegalArgumentException 当容量为负数或加载因子为非正
* 数时抛异常
*/
public HashMap(int initialCapacity, float loadFactor) {
//指定容量为负时抛非法数据异常
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
//指定容量不能超过最大值
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
//指定加载因子非数字或非正数时抛异常
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " + loadFactor);
// 查找大于等于initialCapacity的2的幂指数
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
//加载因子
this.loadFactor = loadFactor;
//阈值
threshold = (int)(capacity * loadFactor);
//Entry数组
table = new Entry[capacity];
//初始化,暂时为空方法
init();
}
这个构造器是基础构造器,其他的构造器都是用它来初始化属性。
2、指定容量HashMap(int initialCapacity)
/**
* 容量指定、加载因子默认0.75的空元素构造器
*
* @param initialCapacity 指定容量
* @throws IllegalArgumentException 容量为负抛异常
*/
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
同之前构造器一样,都是指定容量和加载因子。
3、默认构造器HashMap()
/**
* 默认构造器,采用默认的容量(16)和默认的加载因子(0.75)。
*/
public HashMap() {
//加载因子
this.loadFactor = DEFAULT_LOAD_FACTOR;
//阈值
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
//Entry数组
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
4、传入Map的构造器HashMap(Map<? extends K, ? extends V> m)
/**
* 传入Map,复制Map创建一个新的HashMap,容量为16和
* m.size()/DEFAULT_LOAD_FACTOR(0.75)的最大值,
* 加载因子为默认加载因子(0.75)
* @param m 指定的Map
* @throws NullPointerException Map为空时抛异常
*/
public HashMap(Map<? extends K, ? extends V> m) {
//容量为m.size()/默认加载因子和默认容量的大者
this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
//将Map全部添加到HashMap中
putAllForCreate(m);
}