hashmap底层:jdk1.8前后的改变
2024-09-06 22:26:39
将hashmap和currenthashmap放一块进行比较,是因为二者的结构相差不多,只不过后者是线程安全的。
首先说hashmap,在jdk1.8之前,hashmap的存储结构是数组+链表的形式,可以理解为元素为链表的数组,当添加一个kv对,首先计算key的哈希值,用哈希值对数组长度按位与,以此确定插入的位置,若该位置已有元素,则形成链表,同一链表元素的哈希值相同,当链表数组容量超过初始容量0.75时,将数组扩大一倍。
由上可以看出,当数据量很大时,每一个位置的链表会变得很长,而链表的平均查找长度是n/2,查找耗时很大。
因此jdk1.8后hashmap的存储结构更新为桶+链表/红黑树的形式,和之前相差不多,只不过在对链表长度的反应上做出了改变,当链表长度超过8,链表自动转化为红黑树的形式,当长度小于6,仍为链表,这是因为:红黑树的平均查找长度是log(n),当n=8,平均查找长度是3,链表平均查找长度是4,此时才有转换为红黑树的必要。而之所以采用红黑树,就是因为红黑树查找效率高(它是个二叉平衡树)。
那为什么使用6和8作为链表和红黑树的分割?
这是因为链表到红黑树的转化过程十分耗费资源,选择6和8,而不是7,就是为了避免频繁增删数据时,不断转换耗费大量资源。
最新文章
- 在win7环境下批量修改文件权限
- Linux 进程间通讯详解七
- Python进阶(三)--global和类属性
- Idea 常用快捷键列表
- Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断
- Docker 使用指南 (一)—— 基本操作
- yii2构造方法
- 【原】Spring与MongoDB集成:配置
- XHTML 结构化:使用 XHTML 重构网站
- logcat错误日志
- Access to the temp directory is denied. Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss
- VS2015智能提示由英文改为中文
- DDD实战进阶第一波(九):开发一般业务的大健康行业直销系统(实现经销商上下文仓储与领域逻辑)
- 深入理解css优先级
- 2019Java查漏补缺(一)
- python--文件流读写
- opensips redis配置记录
- Docker 容器备份例子
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group&; dialect&; date-effective
- Spring MVC 学习笔记3 - 利用Default Annotation 模式获取请求,使Controller与View对应,并传值。