HashMap中的tableSizeFor(int cap)

本文解析了如何通过位操作实现静态final int tableSizeFor(int cap)函数,该函数返回最接近给定cap的2的幂次方,通过异或和右移操作调整二进制表示。核心在于将cap转换为1后面全为1的二进制形式,例如9到16。
摘要由CSDN通过智能技术生成
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 的2的幂次方整数,如给定9,返回2的4次方16。

这个算法的大致原理:
假定cap也就是给定数的的形式为00…01XXXXXXX,(X代表可为0也可为1,X前面的1为从最高位开始第一个为1的那一位)
第一步: n |= n >>> 1; 也就是n变为n与n右移一位之后异或后的值,即
n: 00…01XXXXXXX
n>>>1: 00…001XXXXXX
新n: 00…011XXXXXX
第二步: n |= n >>> 2; 也就是n变成n与n右移两位之后异或的值,即
n: 00…011XXXXXX
n>>>2: 00…00011XXXX
新n: 00…01111XXXX
后面相类似。

这个算法不断地把第一个1后面的位全部变成1。本例由00…01XXXXXXX —> 00…011111111,最后再返回n+1(2的幂次方);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值