美文网首页HashMap
HashMap源码阅读预热 02——tableSizeFor(i

HashMap源码阅读预热 02——tableSizeFor(i

作者: 从零开始的程序猿生活 | 来源:发表于2020-12-31 15:29 被阅读0次

    tableSizeFor(int cap)方法的主要作用:
    将参数cap转换成2的n次幂(向上转)
    例如:7 转成 8; 3 转成 4; 12 转成 16;32 转成 32;

    代码:
        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了。

    相关文章

      网友评论

        本文标题:HashMap源码阅读预热 02——tableSizeFor(i

        本文链接:https://www.haomeiwen.com/subject/gxzloktx.html