普歌-允异团队-HashMap

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共有,欢迎交流

猜你喜欢

转载自blog.csdn.net/weixin_52309367/article/details/115563452
今日推荐