首先来看下hashMap的构造方法
HashMap hashMap = new HashMap();
hashMap的无参构造方法非常简单,内部只是默认值的初始化,加载因子 0.75f
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
直接来看下hashMap的两个参数构造方法,在默认值初始化的时候,tableSizeFor控制着hashMap size的大小,具体的实现下看:
public HashMap(int initialCapacity, float loadFactor) {
... // 一些校验判断
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
可读性比较差,我们通过枚举几个cap值,来看下这个方法的作用:
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 = MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
通过图示枚举的cap值,能够发现tableSizeFor 的作用,是为了保证hashMap size 是2的幂,例如我们new HashMap(7),底层实际分配的size 不是 7,而是23 = 8。为何会如此,看下文。
博客专家
原创文章 64获赞 192访问量 17万+
关注
私信
展开阅读全文
作者:mjzuo