面试之HashMap中的常量

HashMap中有很多常量数字,如默认初始大小(DEFAULT_INITIAL_CAPACITY)=16最大容量(MAXIMUM_CAPACITY)=2^{30}默认加载因子(DEFAULT_LOAD_FACTOR)=0.75链表转换红黑树的阀值(TREEIFY_THRESHOLD)=8,这些常量是根据什么定义的呢?

默认初始大小(16)

这个初始的大小是1 << 4,也就是2^{4},首先这个初始大小是2的倍数,因为当length是2的倍数的时候index = h % length可以优化成 h & (length-1)&效率高于%,其次是2的倍数为什么不是4,8,32而是16呢,如果太小的话扩容频繁,太大的话占用内存空间

最大容量

Map中bucket的长度限制是2^{30},这里不是说只能放2^{30}个key-value键值对,因为HashMap是数组加链表结构,这个的bucket是数组的长度,理论上Map的数据量取决于机器内存的大小

默认加载因子

static final float DEFAULT_LOAD_FACTOR = 0.75f;
0.75 这个默认加载因子的取值是空间跟时间的折中,源码中有注释:

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs.
当加载因子是0.75的时候,初始大小16的情况下,存放16*0.75=12个元素的时候需要扩容成32,如果这个加载因子太小则会频繁扩容,反之太大的话需要全部放满才扩容容易产生hash碰撞

链表转换红黑树的阀值

这个值8的话跟加载因子一样,也是一个概率问题

参考:https://www.jianshu.com/p/64f6de3ffcc1

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java集合:HashMap源码剖析 一、HashMap概述 二、HashMap的数据结构 三、HashMap源码...
    记住时光阅读 4,053评论 2 1
  • 一、HashMap概述 HashMap基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用nul...
    小陈阿飞阅读 3,798评论 0 2
  • 前言 HashMap HashMap类继承图 HashMap属性 HashMap构造函数HashMap(int i...
    HikariCP阅读 5,860评论 0 5
  • 按照从构造方法->常用API(增、删、改、查)的顺序来阅读源码,并做简要分析。 一. 概要 概括的说HashMap...
    stoneyang94阅读 2,890评论 0 1
  • 以A将信息发送给B为例 对称加密:A生成密钥,将密钥给B。A使用密钥将信息进行加密,将加密后的信息发送给B,B得到...
    he_321阅读 3,749评论 0 0

友情链接更多精彩内容