专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

HashMap底层实现原理

HashMap底层实现原理

JDK7中底层实现原理

HashMap map = new HashMap();

在实例化以后,底层创建了长度为16的一维数组Entry[] table


…..已经执行过put操作…..

map.put(key1 , value1);

调用key1所在类的hashCode(),计算key1哈希值,此哈希值经过某种算法计算后,得到在Entry数组中的存放位置

  • 如果此位置上为空,此时的key1-value1添加成功(存放的是entry,而entry里面有key和value)
  • 如果此位置上不为空(此位置上存在一个或多个数据(以链表形式存在)),比较当前key1和已经存在的数据的哈希值
    • 如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功
    • 如果key1的哈希值与已经存在的某一个数据的哈希值都相同,调用key1所在类的equals()方法,进行比较
      • 如果equals()方法返回false,此时key1-value添加成功
      • 如果equals()方法返回true,使用value1替换相同的key的value值(修改的功能)

大致过程与HashSet类似
(具体的图解可跳转到如下网址)
https://tech.souyunku.com/CrabDumplings/p/13390443.html

注意:

哈希值不同的添加成功情况和equals()返回false添加成功的两种情况下:

此时key1-value1和原来的数据以链表的方式存储

在不断的添加过程中,会涉及扩容问题,当超出临界值且要存放的位置非空时,需要扩容

默认的扩容方式:扩容到原来容量的2倍,并将数据复制过来

JDK8中底层实现原理

相较于jdk7,在底层实现方面的不同如下

HashMap map = new HashMap();

1、 底层没有创建一个长度为16的数组
2、 jdk8底层的数组:Node[],而非Entry[]数组


map.put(key1 , value1);

1、 首次调用put方法时,底层创建长度为16的数组
2、 jdk7底层结构:数组 + 链表

jdk8底层结构:数组 + 链表 + 红黑树

当数组的某一个索引位置上的元素以链表形式存在的数据个数大于8且当前数组的长度超过64,此时此索引位置上的所有数据改为使用红黑树存储

源码中出现的概念

1、 DEFAULT_INITIAL_CAPACITY:HashMap的默认容量16
2、 DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
3、 threshold:扩容临界值,容量 * 填充因子——16 * 0.75 = 12
4、 TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树——8
5、 MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量——64

未经允许不得转载:搜云库技术团队 » HashMap底层实现原理

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们