美文网首页
个人对Java HashMap理解

个人对Java HashMap理解

作者: 许忠钰的博客 | 来源:发表于2021-06-19 11:08 被阅读0次

1,数据结构

数组+链表+红黑树(JDK>=1.8加入)

长度必须为2的指数幂 即 16 ,32....... 会强制向上转化最近的2的指数幂值
为什么

最低长度为16 即是你设置的是8 他在内部运算时强制向上去2的指数幂即16

2,HASH碰撞
1.任意相同的输入,一定能得到相同的输出
2.不同的输入,有可能得到相同的输出(哈希碰撞)

JDK1.7

put时会先对对象取HashCode,会进行哈希散列,目的是尽可能的避免hash碰撞,然后通过HashCode进行位运算(效率最高,最接近机器语言)得到具体的数组下标位置(hashcode值 & 数组长度值-1,为什么是数组长度-1,由于长度是2的幂次方,不减1进行位运算得话只有两种结果 要么数组的头要么是数组的尾部),找到对应下标的key,value后,判断改key是否已经存在,如果已经存在那么将value值覆盖,由于还是会出现hash碰撞,所以引入了链表,头插法(单线程扩容如果有链表,会出现位置互换)

3.扩容
哈希表的最大容量2的30次方  初始容量2的四次方  默认扩容加因子0.75
容量增加也要满足2的指数次幂,new 一个新的数组, 第一步首先遍历每个数组的下标位,第二步判断是否有链表, 第三步再次进行rehash,第四步将遍历到的数据迁移到新数组
头插法(单线程扩容如果有链表,会出现位置互换) 多线程扩容由于采取头插法会死循环( 链表成环 死锁)无法避免
高阶:为什么默认扩容因子是0.75
0.75是JAVA开发者从空间和时间上认为0.75为合适的值
最好的值为0.69 

JDK8中引入了红黑树
只有等链表长度达到9时 会将链表转换为红黑树

相关文章

  • 个人对Java HashMap理解

    1,数据结构 数组+链表+红黑树(JDK>=1.8加入) 长度必须为2的指数幂 即 16 ,32....... 会...

  • 深入理解HashMap

    深入理解HashMap 什么是HashMap HashMap作为Java语言中一种重要的类型,其存储数据通过键值对...

  • 初探HashMap源码

    HashMap是java开发中很长用的类,之前对HashMap的理解仅仅停留在日常的使用上,今天尝试从源码去理解下...

  • Java集合-HashSet源码实现分析

    概要 阅读本文前,请先阅读笔者写的文章:Java集合-HashMap源码实现深入解析理解了HashMap,再来理解...

  • Java自学-集合框架 HashMap

    Java集合框架 HashMap 示例 1 : HashMap的键值对 HashMap储存数据的方式是—— 键值对...

  • HashMap 理解

    参考链接:HashMap原理深入理解java中HashMap原理?面试?你是谁,你在哪 HashMap实际上是一个...

  • Java——HashMap

    Java中HashMap的工作原理: 一,存储方式: Java中的HashMap是以键值对(key-value)...

  • Java8 HashMap源码解析

    Java8 HashMap Java8 在 Java7 的基础上对 HashMap 进行优化,由数组+链表结构,改...

  • Java集合之Map与HashMap,另含Iterator与

    Java集合之HashMap (一)HashMap的简要特点 HashMap是最常用的Map,用于存储键值对。 键...

  • 思考LinkedHashMap

    学习有序HashMap实现原理 挖掘背后实现,加深对java集合框架理解 demo书写 这时候打印的就是put时候...

网友评论

      本文标题:个人对Java HashMap理解

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