hashmap初始化容量

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

这段代码解读一下 比如说你传了一个 cap为13

n= 13-1;
n=12;
n |= n >>> 1;
12的二进制 (1100)向右无符号右移1位 变成 110;
然后拿这个110 和 上面那个12的二进制1100进行 或运算 (1100|110)结果为 1110;

n |= n >>> 2;
上一步的结果为1110 再次向右移2位 得到 11;然后在和1110或运算(1110|11)结果为1111;

n |= n >>> 4;
上一步得到结果为1111 右移4位 得到 0;然后就1111|0 还是 1111;

下面就不用说了,你像→不管移多少大于4的位数都是得到的0.然后在和1111或运算最终结果还是1111
也就是15;
那在执行最终那一个return :
(n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
15不小于0,所以取后面的 15是否大于等于 后面那个值 也就是:
static final int MAXIMUM_CAPACITY = 1 << 30;
和显然不大于 那就是n+1喽 就是 16;2的4次方;

你们可以大胆的试,不管你输入什么值他最终都会得到一个和你输入值的最近的一个2的次方值且大于等于你输入的值;

别问我为什么,这大概就是那数学该死的魅力吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值