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

  • 相关阅读:
    Codeforces 1515 H. Phoenix and Bits 题解
    Codeforces 1511 F. Chainword 题解
    Codeforces 1369F. BareLee 题解
    莫队学习笔记
    圆方树学习笔记
    虚树学习笔记
    NOIP2020退役记
    CSP-S2 2021 场外
    我。
    WC2021 游记
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9996695.html
Copyright © 2011-2022 走看看