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://www.cnblogs.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
本站资源均源自网络,若涉及您的版权、知识产权或其他利益,请附上版权证明邮件告知。收到您的邮件后,我们将在72小时内删除。
若下载资源地址错误或链接跳转错误请联系站长。站长q:770044133。

» HashMap底层实现原理

发表评论

免登录下载网,提供全网最优质的资源集合!