构造函数:
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
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);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
默认是使用 HashMap这个构造函数的,当初始化一个构造函数的时候,HashMap内部是默认初始化了HapMap里面的默认负载因子,默认的初始容量 16;
如果自定义了负载因子以及初始容量,在初始化的时候会判断负载因子以及初始化的容量是否大于最大的容量以及最小是否小于0。然后调用初始化容量,存入最接近2的n次方的整数,最后初始化threshold 阈值
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
n |= n >>> 1; 这个是把n变为n与n右移一位之后或等于后的值
|= 的含义:
两个二进制对应位为0时该位为0,否则为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行|运算,后三位的的对应位都不是同时等于0,所以最终结果为 0000 0111 也就是7的二进制。
tableSizeFor 这个方法就是返回 大于传入的cap值之后,返回最接近2的n次方的数;