美文网首页
面试之HashMap中的常量

面试之HashMap中的常量

作者: skywalkboy | 来源:发表于2019-04-04 15:13 被阅读0次

    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

    相关文章

      网友评论

          本文标题:面试之HashMap中的常量

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