HashMap初始容量的设置方法

一般如果new HashMap() 不传值,默认大小是16,负载因子是0.75, 如果自己传入初始大小k,初始化大小为 大于等于k的 ,最接近k的2的整数次方,例如如果传10,大小为16。

实现代码如下:

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;
}

注释:MAXIMUM_CAPACITY为HashMap最大容量:1 << 30

下面来分析上述代码为什么能够实现返回大于等于cap的且最接近cap的2的整数次方,分为以下两种情况进行讨论:

1. cap值原本就为2的整数次方,那应当返回原值,我们以32为例:

2.cap值不是2的整数次方,应当大于cap且距离cap最近的2的整数次方,我们以50为例:

posted @ 2021-04-06 22:04  Coder豪  阅读(567)  评论(0编辑  收藏  举报