Map集合之HashMap
2021/5/9 18:30:25
本文主要是介绍Map集合之HashMap,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java中关于map的集合,想总结一下
HashMap
HashMap的结构
JDK1.7组成:数组+链表 Entry的数组
JDK1.8组成:数组+链表+红黑树 Node的数组
JDK1.7链表采用的头插法:可能会产生链表环路,产生死循环的问题,造成cpu的使用率飙升。
JDK1.8链表采用的尾插法: 解决了链表环路问题 。
问题 :为什么会产生链表环路
因为在高并发下有多个线程,可能会发生多个线程对hashmap进行rehash(扩容)操作,扩容操作会对hash桶上的链表进行重新hash值%(length-1)操作,让链表上的元素找到新的存放位置,例如某个hash桶上的链表a->b->c(链表上的元素和指向关系),当进行扩容时a,b,c很巧又落到同一个hash桶上面了,线程1进行rehash操作先获得a(当然a->b->c,线程1把指向关系记录下来),很巧线程1刚好获取a时,cpu时间片用完了,线程2进行put操作是也发现hashmap需要扩容,也进行rehash操作,线程2成功进行rehash扩容使得hash桶上面链表执行c->b->a(尾插法会改变链表顺序,这也是为什么产生链表环路的问题),线程1重新获得cpu执行权,执行完a时,去执行b时(进行b->a操作)发现b已经指向a,a同时指向b,a->b,b->a,这样就会形成环。
详细请看这篇
HashMap初始参数
JDK1.7
1.无参数 当创建HashMap时,当无参时,默认情况下: 负载因子为0.75f 默认Entry数组长度为16,默认阈值为12(16*0.75f):
2 .只输入初始容量 和 输入负载因子:Entry初始数组长度:2的n次幂的>=输入初始长度(n取最小),负载因子:为输入负载因子 ;
3 .只输入初始容量:负载因子为0.75f Entry初始数组长度:2的n次幂的>=输入初始长度(n取最小);
JDK1.8
为什么创建的数组初始长度必须为2的n次幂:
因为:
这篇关于Map集合之HashMap的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27本地多文件上传的简单教程
- 2024-11-27低代码开发:初学者的简单教程
- 2024-11-27如何轻松掌握拖动排序功能
- 2024-11-27JWT入门教程:从零开始理解与实现
- 2024-11-27安能物流 All in TiDB 背后的故事与成果
- 2024-11-27低代码开发入门教程:轻松上手指南
- 2024-11-27如何轻松入门低代码应用开发
- 2024-11-27ESLint开发入门教程:从零开始使用ESLint
- 2024-11-27Npm 发布和配置入门指南
- 2024-11-27低代码应用课程:新手入门指南