zoukankan      html  css  js  c++  java
  • HashMap扩容

    前言:当您在读该文章的时候,我认为您已经知道HashMap的底层实现原理,如果您还不清楚HashMap是如何实现的,请先去了解,再回来看本文章。

    1.HashMap什么时候扩容?

    HashMap的容量是有限的。当经过多次元素插入的时候,使得HashMap达到一定的饱和度,Key映射位置的几率不断变大。这个时候,HashMap就需要扩容了,也就是Resize。

    影响发生Resize的因素有两个:

    1)Capacity:HashMap的当前长度,HashMap的长度必是2的幂。

    测试一下:

    请问如下map的长度分别为多少呢?

    1. HashMap<String,String> map = new HashMap<String, String>();
    2. HashMap<String,String> map = new HashMap<String, String>(8);
    3. HashMap<String,String> map = new HashMap<String, String>(5);

    答案:16 8 8 你答对了么?(原理很简单,就是HashMap的长度必是2的幂)

    2)LoadFactor:HashMap负载因子,默认是0.75f。

    当 HashMap.size >= Capacity*LoadFactor 时,HashMap就会进行Resize。

    2.HashMap怎么扩容?

    1)创建一个新的Entry空数组,长度是原来的2倍。

    2)遍历原Entry数组,把所有的Entry重新Hash到新数组里。为什么要重新Hash呢?因为长度扩大以后,Hash的规则也随之改变了。

    让我们了解一下Hash公式:

    index = HashCode(key) & (Length - 1) jdk1.8 

    网上有另一种说法: index = HashCode(key)% Length jdk1.7

    当你经过运算的时候,你就会发现,两种方式得到的结果是一致的,所以都正确。

    注意:HashMap并不是线性安全的,在并发的情况下可能会形成链表环。

    3.jdk1.8对HashMap做的哪些优化?

    1)哈希值的计算方法

    实际上在jdk1.7中使用的是取模算法,而jdk1.8中使用的是高位与运算。因为&运算比%运算速度更快。

    2)引入红黑树

    如果HashMap的同一个Hash桶中链表节点数超过8个,则链表转为红黑树处理。

    https://zhuanlan.zhihu.com/p/33714985

  • 相关阅读:
    servlet之中文乱码:request.getParameter()
    html页面标题增加图标方法
    前端页面设计素材网站
    修电脑大全,学会不求人
    十篇TED点击率最高演讲,带你重新认识大数据与人工智能
    除了乔布斯,科技圈还有哪些大佬值得充信仰?
    快速建设网站的框架
    前端框架资源汇总
    获取页面跳转携带参数问题
    值得关注的博客和网站
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9996695.html
Copyright © 2011-2022 走看看