• 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

  • 相关阅读:
    画架构图
    做产品的方方面面
    Tomcat一个有意思的漏洞
    LinkedHashMap 作为一个 CacheMap
    Maven提高篇系列之五——处理依赖冲突
    javaweb获取项目路径的方法
    curl工具介绍和常用命令
    Spring事务管理(详解+实例)
    如何更好地使用Java 8的Optional
    input的type=file触发的相关事件
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9996695.html
Copyright © 2020-2023  润新知