构造方法
构造方法
1、无参构造方法HashMap()
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
}
2、指定初始容量的构造方法HashMap(int initialCapacity)
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
3、构造方法HashMap(int initialCapacity, float loadFactor)
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);
}
调整初始化容量大小tableSizeFor(initialCapacity)
该方法在JDK11中与JDK1.8中的实现不一样。在JDK1.8中对n进行和五次右移和异或运算。 在JDK11中,调用的是Integer中的numberOfLeadingZeros(int i)方法,获取了n的二进制补码中最高位之前0的个数,对-1进行了一次右移。 在numberOfLeadingZeros(int i)方法中,没有了异或操作,并且对 i 右移的操作次数根据 i 的值决定,最多5次,最少1次。虽然对 1 进行了 4次左移,但是对1 进行左移操作效率比对一个随机整数进行右移操作效率要高。 该方法从JDK1.8到JDK11的升级提高了效率。
JDK11
该方法是为了将HashMap的容量调整为2的整数次幂。
static final int tableSizeFor(int cap) {
int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1);
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
JDK1.8
该方法是为了将HashMap的容量调整为2的整数次幂
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;
}
|