zoukankan      html  css  js  c++  java
  • HashMap原理分析(JDK1.7.x之前)

    HashMap 实现Map、Cloneable、Serializable接口,继承AbstractMap基类。


    HashMap map = new HashMap<String,String>();
    实例化一个HashMap,在构造参数中,设置了默认的loadFactor(DEFAULT_LOAD_FACTOR,负载因子,初始值float类型,0.75),内部Entry的数组大小DEFAULT_INITIAL_CAPACITY(默认容量,初始值int类型16)。

    设置负载因子,设置阀值(threshold = loadFactor * CAPACITY),创建Entry内部数组,数组的大小按照2的次幂设置。

    负载因子

    作用:用来控制扩容,扩容的主要目的是因为数据密度已经很高了,继续插入会引起更多的hash碰撞,导致数组单个元素内链表的长度的增加,从而引起性能下降;

    容量参数为什么要是2的N次方

    为了indexFor方法里,高性能的取模。h % length 需要讲数据转为十进制进行计算,而h & (length -1)直接通过该位运算

    .hash(内部方法)

    将key的hashCode进行再次hash,使其更散。

    .put 

    对key进行hash,通过hash值传到indexFor中计算新的K-V值存放数组的位置。
    在put的时候发现Entry数组不够的情况会按照2*当前容量来进行扩容,resize方法,原来的数据需要做重新hash运算。

    .get

    对key进行hash,通过得到的hash值闯到indexFor中计算K-V值存放数组的位置。


    .resize

    当元素实际大小大于等于阀值的时候,按照Entry数组的2倍容量重新定义一个新的数组。然后将旧的Entry重新hash,indexFor存入新的Entry数组。

  • 相关阅读:
    NHibernate使用之详细图解
    iBatis for Net 代码生成器(CodeHelper)附下载地址(已经升级为V 1.1)
    设置devenv命令的启动版本
    NBear简介与使用图解
    jQuery 插件取url参数[jquery.url.js]的使用以及文件下载
    Ajax跨子域
    XML 通用操作
    NVelocity标签使用详解
    Visual Studio 2010 中JS注释制作
    windows自定义快速启动(运行)命令
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712923.html
Copyright © 2011-2022 走看看