zoukankan      html  css  js  c++  java
  • HashMap是如何进行扩容的?

    HashMap通过resize()方法进行扩容。

    源码解析:

    resize()函数有两种使用情况:

    一、当table数组为null时初始化hash表。

     二、当table数组不为null时进行扩容。

    1、如果table数组的容量超过最大容量时,无法扩容,直接返回旧的数组。并将threshold值设置为Integer.MAX_VALUE(2^31-1),

    2、如果table数组的容量扩展为原来的2倍时仍没有超过最大容量且table数组原来的长度已经大于默认的初始容量时,将threshold扩大为原来的2倍。

    3、将旧数组中的节点转移到新的数组中去

    1)、如果旧数组中的头节点不为null且头节点没有下一个节点,则先将旧数组置空,再计算该节点在新数组的索引,最后将该节点放到新数组的该索引位置处

    2)、如果旧数组中的头节点为树节点,则按树节点的方式处理。

    3)、如果旧数组中的头节点有下一个节点,则将下一个节点赋值给next,经过观测可以发现,我们使用的是2次幂的扩展(指长度扩为原来2倍),所以,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。当将该头节点放到新数组时的索引位置等于其在旧数组的索引位置,如果尾节点为null,则将e赋值给头节点,,并将e赋值给尾节点.;如果尾节点不为null,则将e赋值给尾节点的下一个节点,并将e赋值给尾节点。如果尾节点不为null,则将尾节点的next属性置为null,再将头节点赋值给新数组的索引位置。

    当将该头节点放到新数组时的索引位置等于其在旧数组的索引位置再加上旧数组的长度,如果尾节点为null,则将e赋值给头节点,,并将e赋值给尾节点.;如果尾节点不为null,则将e赋值给尾节点的下一个节点,并将e赋值给尾节点。如果尾节点不为null,则将尾节点的next属性置为null,再将头节点赋值给新数组的索引位置(就数组的索引位置+旧数组的长度)。

  • 相关阅读:
    导入maven工程遇见的问题【问题】
    Java 反射机制
    SSH 使用JUnit测试
    Struts2 Convention插件的使用(4)使用@Action注解返回json数据
    Struts2 Convention插件的使用(3)方法前的@Action注解
    Struts2 Convention插件的使用(2)return视图以及jsp的关系
    Struts2 Convention插件的使用(1)
    Struts2 直接返回字符串(可用于json)
    PowerDesigner 将CDM、PDM导出为图片
    Servlet3.0-使用注解定义Servlet
  • 原文地址:https://www.cnblogs.com/zwh0910/p/14354328.html
Copyright © 2011-2022 走看看