zoukankan      html  css  js  c++  java
  • HashMap的最大容量为什么是2的30次方?

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

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

    2. 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位,而不能移动到处在最高位的符号位!

    HashMap的最大容量为什么是1<<30?

    --------------------- 本文来自 爱码僧 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_33666602/article/details/80139620?utm_source=copy 

  • 相关阅读:
    Ldap遇到了事务管理问题
    Spring-Ldap连接Ldap及简单的增删查改
    枚举与数组的使用
    GDI_TCanvas
    获取鼠标当前位置的相对坐标、模拟鼠标点击事件
    绘制不规则图片、窗体与图形
    Message使用
    泛型_Tlist存储对象
    控件Owner和Parent的区别
    鼠标拖放
  • 原文地址:https://www.cnblogs.com/hellowzd/p/9723230.html
Copyright © 2011-2022 走看看