HashMap
-
HashMap是基于哈希表的Map接口的非同步实现
Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的
此实现提供所有可选的映射操作,并允许使用null值和null键。
此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 -
主要是:
存储 put
查询 get
Key value -
hashMap 的实现
存储 --> 数据结构
数组:采用一段连续的存储单位来存储数据
特点:查询0(1)删除插入0(N)
总结:查询快 原因 :有索引
插入慢 原因 :结点后移 -
JDK7数组加链表
链表:物理存储单元上非连续,非顺序的存储结构
特点:插入快 :时间复杂度O(1)
查询慢 :时间复杂度O(N)
Linkedlist (双向链表) ——》add——》linklast——》Node
Next ———》
Prev 《———
算法 :哈希算法
- JDK8数组,链表,红黑树
红黑树: 解决链表过长查询效率过低问题(TreeNode)
查询快 插入慢
阈值为8 的原因
hashcode碰撞次数的 泊松分布(泊松分布就是描述单位时间内,独立事件发生的次数。)有关,主要是为了寻找一种时间和空间的平衡。在负载因子0.75(HashMap默认)的情况下,单个hash槽内元素个数为8的概率小于百万分之一,将7作为一个分水岭,等于7时不做转换,大于等于8才转红黑树,小于等于6才转链表。链表中元素个数为8时的概率已经非常小,再多的就更少了,所以原作者在选择链表元素个数时选择了8,是根据
概率统计而选择的。
红黑树中的TreeNode是链表中的Node所占空间的2倍,虽然红黑树的查找效率为o(logN),要优于链表的o(N),但是当链表长度比较小的时候,即使全部遍历,时间复杂度也不会太高。所以,要寻找一种时间和空间的平衡,即在链表长度达到一个阈值之后再转换为红黑树。
红黑树转链表的阈值为6,主要是因为,如果也将该阈值设置于8,那么当hash碰撞在8时,会反生链表和红黑树的不停相互激荡转换,白白浪费资源。
CPU100% 原因(并发时)
头插法(头部插入)
两个同时访问,增加数据是需要扩容
先存储A,在存B
链表双向,形成死循环
最后造成CPU100%
-
作者:麦克猫Cat
-
本文版权归作者和CSDN共有,欢迎交流