当前位置: 首页 > news >正文

【HashMap 1.7和1.8】

Java中的HashMap是一种常用的数据结构,用于存储键值对。在Java 1.7和1.8中,HashMap的实现有一些不同。
Java 1.7中的HashMap实现是基于“拉链法”的哈希表。每个哈希桶(bucket)是一个链表,存储了散列值相同的键值对。当键值对数量过多时,链表长度会变得很长,导致查找效率下降。此时,需要调整哈希桶大小或转换为红黑树来提高效率。
Java 1.8中的HashMap实现则在1.7的基础上进行了改进。当链表长度超过一定阈值(默认为8)时,会将链表转换为红黑树,以提高查找、插入和删除操作的效率。同时,1.8版本引入了CAS操作(Compare And Swap),用于实现线程安全的并发访问。
除了以上改进,Java 1.8中的HashMap还增加了一些新的API和实现细节,例如:

使用Node<K,V>代替Entry<K,V>:Node是HashMap中的一个内部类,用于表示键值对,替代了旧版本中的Entry。
使用TreeBin代替红黑树:TreeBin是HashMap中的一个内部类,用于表示红黑树,提高了代码的可读性和维护性。
使用TreeifyBin代替红黑树的退化:TreeifyBin是HashMap中的一个内部类,用于表示红黑树退化成链表的情况,使代码更加清晰。
使用TreeNode代替红黑树节点:TreeNode是HashMap中的一个内部类,用于表示红黑树节点,与Node的定义相比更加简洁。

总之,Java 1.8中的HashMap相比于1.7版本有了较大的改进,提高了性能和可靠性,并增加了一些新的API和实现细节,方便开发者使用和维护。

HashMap 1.7和1.8扩容机制

在 Java 1.7 中,HashMap 的扩容机制是当容量超过负载因子与数组长度的乘积时就会进行扩容。默认负载因子为 0.75,即当数组长度为 n 时,当元素个数 size 超过 n * 0.75 时就会扩容。扩容时,数组长度会变为原来的 2 倍,并且将原来的元素重新计算哈希值,再散列到新数组中。

在 Java 1.8 中,HashMap 的扩容机制有了改进。当链表长度超过阈值(默认为 8)时,将链表转换为红黑树。如果红黑树节点数少于 6,则将红黑树转回为链表。这样可以减少因为过长的链表而导致的查找效率降低。在进行扩容时,1.8 版本不再使用重散列的方式,而是采用了新的方式进行扩容。具体地,扩容过程中,原数组中的每个元素会被复制到新的数组中,而不需要重新计算哈希值和重新散列。

总的来说,Java 1.8 中的 HashMap 扩容机制相比 Java 1.7 中的有了很大的改进,避免了一些性能瓶颈。同时,1.8 版本引入了红黑树来优化链表过长的情况,提高了查询效率。

作者:lfsun666
链接:https://juejin.cn/post/7203397626526908475
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://www.lryc.cn/news/20267.html

相关文章:

  • 【Zabbix实战之故障处理篇】Zabbix监控中文乱码问题解决方法
  • 学习(mianshi)必备-ClickHouse高性能查询/写入和常见注意事项(五)
  • 在Kotlin中探索 Activity Results API 极简的解决方案
  • 样式冲突太多,记一次前端CSS升级
  • 如何解决报考PMP的那些问题?
  • 数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】
  • 数据结构与算法之打家劫舍(一)动态规划思想
  • 无人驾驶路径规划论文简要
  • C++ sort()函数和priority_queue容器中比较函数的区别
  • STM32开发(14)----CubeMX配置ADC
  • Simple RNN、LSTM、GRU序列模型原理
  • 【原创】java+swing+mysql生肖星座查询系统设计与实现
  • CentOS 环境 OpneSIPS 3.1 版本安装及使用
  • SQL95 从 Products 表中检索所有的产品名称以及对应的销售总数
  • 平时技术积累很少,面试时又会问很多这个难题怎么破?别慌,没事看看这份Java面试指南,解决你的小烦恼!
  • SQL Server 数据库的备份
  • NCNN Conv量化详解1
  • Redis大key多key拆分方案
  • python的类如何使用?兔c同学一篇关于python类的博文概述
  • Day60 动态规划总结
  • UVM仿真环境搭建
  • Azure AI基础到实战(C#2022)-认知服务(1)
  • 光栅化Triangles(笔记)
  • 【Oarcle】如何显示日本年号的日期格式 ?
  • 57_Pandas中的json_normalize将字典列表转换为DataFrame
  • OpenAPI SDK组件之javassist字节码
  • 【LeetCode】1247. 交换字符使得字符串相同(超级简单的算法,击败100%)
  • 23. 合并K个升序链表
  • 软中断与tasklet简介
  • JUC 之 线程阻塞工具 LockSupport