0
点赞
收藏
分享

微信扫一扫

HashMap源码阅读预热 02——tableSizeFor(int cap)方法

一叶轻舟okok 2021-09-25 阅读 43
代码:
    public static void main(String[] args) {

        System.out.println(tableSizeFor(3));// 4
        System.out.println(tableSizeFor(7));// 8
        System.out.println(tableSizeFor(12));// 16
        System.out.println(tableSizeFor(32));// 32

    }

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

那么这个算法是怎么实现的呢?

原理分析:

|= 这个运算符的意思:
a |= b
a | b 再将结果复制给 a (类似 a += b)

拿cap = 3的时候来举例:
n = 3 -1 = 2 ==> 二进制为:0000 0010
解析:n |= n >>> 1;
n >>> 1 是将n无符号右移1位,即:0000 0001
n为2(0000 0010)与0000 0001 的或结果为:0000 0011
······
下面的操作也是类似,最后n的结果为:
0000 0011
返回值 n+1 的结果为:0000 0100即:4

总结:

这个算法会把从第一个 1 开始后面的所有位都变成1 ,最后返回结果的时候 +1 返回的就是 2的n次幂了
问题:为什么第一次进方法时要 -1 呢?
答:因为要兼容 cap 本身就是 2的n次幂的情况。
例如:cap 是4 (0100),如果不 -1 的话 最后n的结果为 :0111 ,返回值再进行 +1的操作的时候返回的就是 8了。

举报

相关推荐

0 条评论