• HashMap的最大容量为什么是2的30次方?


    今天看HashMap的底层实现,发现HashMap的最大容量规定为:

    // 最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换)

    static final int MAXIMUM_CAPACITY = 1 << 30;

    当看到 1<<30 时,对“<<” 有点模糊,当了解“<<”的用法之后,又有一个问题;

    int类型不是4个字节共32位吗,为什么不是 1<<31呢?

    首先介绍下等号右边数字及字符的含义:

    1、"<<"为左移运算符,1表示十进制中的“1”,30表示十进制数字1转化为二进制后向左移动30位。在数值上等同于2的30次幂。

    2、为什么是2的30次幂?

    以一个字节为例:1<<2 = 4

    0000 0001(十进制1)

    向左移动两位之后变成

    0000 0100(十进制4)

    可见 1<<30 等同于十进制中2的30次幂。

    回到题目,为什么会是2的30次幂,而不是2的31次幂呢?

    首先:JAVA规定了该static final 类型的静态变量为int类型,至于为什么不是byte、long等类型,原因是由于考虑到HashMap的性能问题而作的折中处理!

    由于int类型限制了该变量的长度为4个字节共32个二进制位,按理说可以向左移动31位即2的31次幂。但是事实上由于二进制数字中最高的一位也就是最左边的一位是符号位,用来表示正负之分(0为正,1为负),所以只能向左移动30位,而不能移动到处在最高位的符号位!
    ————————————————
    版权声明:本文为CSDN博主「爱码僧」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_33666602/java/article/details/80139620

  • 相关阅读:
    luogu P3704 [SDOI2017]数字表格
    「雅礼集训 2018 Day4」Magic(分治NTT)
    「清华集训 2017」小 Y 和恐怖的奴隶主
    [WC2019]数树(树形dp+多项式exp)
    「FJWC2020Day5-zzq」lg (容斥)
    BoundedOptimization TopCoder
    MapGuessing TopCoder
    线性递推(Berlekamp-Massey 算法)
    杜教筛小记
    「余姚中学 2019 联测 Day 6」解码
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/12983411.html
Copyright © 2020-2023  润新知