美文网首页
jdk1.8 HashMap

jdk1.8 HashMap

作者: markdownpad | 来源:发表于2018-03-23 15:09 被阅读0次

capacity、threshold和loadFactor之间的关系

1、capacity table的容量,默认容量是16;

2、threshold table扩容的临界值,当table的size大于该值触发扩容;

3、loadFactor 负载因子,一般 threshold = capacity * loadFactor,默认的负载因子0.75是对空间和时间效率的一个平衡选择;

put操作

1、判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;

2、根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,M转向6,如果table[i]不为空,转向3;

3、判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向4,这里的相同指的是hashCode以及equals;

4、判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向5;

5、遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;

6、插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。

resize过程

触发条件:当新增一个值时,插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容,步骤如下:

1、判断是否是最大值,是不再扩容,返回;

2、判断是否数组长度为0,是初始化长度为8;

3、没有超过最大值,扩容,大小为原来的2倍;

4、把旧的数组元素放到新的数组中,要不在原来的位置,要不在原来位置的2倍位置上;

https://blog.csdn.net/ltt1554287102/article/details/73549756

https://blog.csdn.net/Richard_Jason/article/details/53887222

相关文章

  • HashMap 底层是怎么样的

    JDK1.8 之前 JDK1.8 前,HashMap 底层是 数组+链表,也就是 链表散列。 HashMap 通过...

  • 手写简单HashMap

    今日学习:1、了解jdk1.8版的HashMap原理2、手写jdk1.8版之前的HashMap 前言     好几...

  • JDK1.8的HashMap源码分析

    JDK1.8之前的HashMap 在JDK1.8之前,HashMap通过散列表(哈希表)实现,并且散列表冲突解决方...

  • Java集合目录

    一、简述 二、原理分析 HashMap(JDK1.7) HashMap(JDK1.8)

  • HashMap源码解析

    HashMap在JDK1.8之前底层的实现方式是数组+链表,从JDK1.8开始对HashMap底层进行了优化,改为...

  • 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,...

  • 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,...

  • 深入浅出学Java-HashMap

    一、概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优...

  • HashMap

    1.概要 HashMap在JDK1.8之前的实现方式数组+链表,但是在JDK1.8后对HashMap进行了底层优化...

  • HashMap源码分析(JDK1.8)

    HashMap简介 JangGwa从源码角度带你熟悉一下JDK1.8的HashMap,首先简单介绍下HashMap...

网友评论

      本文标题:jdk1.8 HashMap

      本文链接:https://www.haomeiwen.com/subject/uylxcftx.html