首页 > 其他分享 >hashMap

hashMap

时间:2024-01-30 20:12:24浏览次数:22  
标签:hash hashMap 树化 链表 哈希 红黑树 root

HashMap

底层数据结构,1.7和1.8?

1.7数据加链表

1.8数组加链表或者红黑树

链表中元素多变化为红黑树,删除退化为链表

为何一上来不树化,树化阈值为何是8,何时会树化,何时退化为链表?

1.7时候链表太长了会影响性能,数组容量大于64 和阈值大于8同时满足

 

为何一上来不进行树化

链表短要好的,长的化。

链表是node,红黑树treenode;

 

 

红黑树是一种问题情况

1.防止dos攻击机,防止链表超长时性能下降,树化应当是偶然情况

泊松分布,负载因子0.75下,是0.0000006,选择8树化概率小

 

何时退化链表:

1.做一次扩容,阈值小于等于6

2.退化条件2:remove 树节点,若root,root.left,root.right,root.left 有一个为null也会退化

(移除之前检查)

3/4扩容 原来2倍

 

索引怎么计算?hashcode,为何提供hash(),数组容量为何为2的n次秘?

首先计算对象的hashcode(),然后调用hashmap的hash()方法进行二次哈希,最后得到哈希

 

hashcode

二次哈希 :通过对原始哈希表的计算实现更高效的查询和匹配,与单一比,二次哈希

算法能够在哈希表中多个键执行哈希操作,减少哈希冲突。哈希冲突是指当俩个或多个键得映射

在同一哈系统发生的问题,导致查询效率低,

二次哈希作用:1.8位移16位。不是用hash进行索引,分布均匀,足够随机。

 

 

初始必须2的n次方

二次哈希后%16运算,得到桶下表

求m%运算可以优化为$运算

2的n次幂好处(最求效率)

1.用按位与替换取模运算,效率更高,2.扩容是hash& oldCap==0 的元素留在原来位置,

否则新位置=旧位置+oldCap3.计算索引&(capacity -1)

2的n次幂缺点

分布性不太好

最求哈希表的分布好,选质数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

HashMap

底层数据结构,1.7和1.8?

1.7数据加链表

1.8数组加链表或者红黑树

链表中元素多变化为红黑树,删除退化为链表

为何一上来不树化,树化阈值为何是8,何时会树化,何时退化为链表?

1.7时候链表太长了会影响性能,数组容量大于64 和阈值大于8同时满足

 

为何一上来不进行树化

链表短要好的,长的化。

链表是node,红黑树treenode;

 

 

红黑树是一种问题情况

1.防止dos攻击机,防止链表超长时性能下降,树化应当是偶然情况

泊松分布,负载因子0.75下,是0.0000006,选择8树化概率小

 

何时退化链表:

1.做一次扩容,阈值小于等于6

2.退化条件2:remove 树节点,若root,root.left,root.right,root.left 有一个为null也会退化

(移除之前检查)

3/4扩容 原来2倍

 

索引怎么计算?hashcode,为何提供hash(),数组容量为何为2的n次秘?

首先计算对象的hashcode(),然后调用hashmap的hash()方法进行二次哈希,最后得到哈希

 

hashcode

二次哈希 :通过对原始哈希表的计算实现更高效的查询和匹配,与单一比,二次哈希

算法能够在哈希表中多个键执行哈希操作,减少哈希冲突。哈希冲突是指当俩个或多个键得映射

在同一哈系统发生的问题,导致查询效率低,

二次哈希作用:1.8位移16位。不是用hash进行索引,分布均匀,足够随机。

 

 

初始必须2的n次方

二次哈希后%16运算,得到桶下表

求m%运算可以优化为$运算

2的n次幂好处(最求效率)

1.用按位与替换取模运算,效率更高,2.扩容是hash& oldCap==0 的元素留在原来位置,

否则新位置=旧位置+oldCap3.计算索引&(capacity -1)

2的n次幂缺点

分布性不太好

最求哈希表的分布好,选质数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hash扩容是2倍

红黑树类似于平衡二叉树

链表n

log2n

 

 

 

 

 

 

 

 

 

 

 

 

hash扩容是2倍

红黑树类似于平衡二叉树

链表n

log2n

 

 

 

 

 

 

标签:hash,hashMap,树化,链表,哈希,红黑树,root
From: https://www.cnblogs.com/zyb-luckey/p/17997860

相关文章

  • 31-ArrayList和HashMap集合的排序
     扩展:在List集合中添加另一个集合时,一般常用两种方法booleanadd(Ee): 将list作为一个元素添加到集合中booleanaddAll(Collection<?extends E> c):把list中的所有元素添加到集合中 ArrayList类的排序方法(常用)packagelist;importjava.util.ArrayList......
  • hashmap线程不安全 ConcurrentHashMap是如何实现线程安全的
       2、JDK1.8中的数据覆盖(1)dk1.7的数据丢失、死循环问题在JDK1.8中已经得到了很好的解决,直接在HashMap的resize()中完成了数据迁移。(2)为什么说JDK1.8会出现数据覆盖的情况?查看这段JDK1.8中的put操作代码:在这里插入图片描述如下图框中的代码是判断是否出现hash碰撞,假设两个......
  • 思考:JDK1.8之后HashMap为什么要加入红黑树
    在JDK1.7时如果构造1000w个哈希码相同的字符串,把他们全部插入HashMap中,这将导致严重的哈希冲突1000w个字符串全部挤入到一个哈希桶中,从而形成一个超长链表,这时候的HashMap的性能将从O(1)退化到O(n)为什么性能会退化到O(n)?因为在插入的时候要先比较这个节点是不是存在,因为每个......
  • ConcurrentHashMap源码逐行解读基于jdk1.8
    前导知识//node数组最大容量:2^30=1073741824privatestaticfinalintMAXIMUM_CAPACITY=1<<30;//默认初始值,必须是2的幕数privatestaticfinalintDEFAULT_CAPACITY=16;//数组可能最大值,需要与toArray()相关方法关联st......
  • 简单剖析Hashmap
    剖析JavaHashmap源码在Java的集合框架中,HashMap是一颗璀璨的明珠。通过深入挖掘其源码,我们将揭开HashMap的神秘面纱,理解其底层原理、扩容机制和数据结构。1.HashMap源码导读我们首先来看一段简单的代码,创建一个空的HashMap:importjava.util.HashMap;publicclass......
  • 《数据篇》HashMap
    简介参考链接:https://www.cnblogs.com/scxgy/p/15398631.htmlHashMap是一个散列表,它存储的内容是键值对(key-value)映射。它是无序的,不会记录插入的顺序。(散列表,英文hashtable)HashMap实现了Map接口,根据键的HashCode值存储数据,最多允许一条记录的键为null,不支持线程同步。HashMa......
  • 【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)
    承接上文在阅读了上篇文章《【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)》之后,相信您对HashMap的基本原理和基础结构已经有了初步的认识。接下来,我们将进一步深入探索HashMap的源码,揭示其深层次的技术细节。通过这次解析,您将更深入地理解HashMap的......
  • HashMap & HashSet源码阅读
    目录简介模型代码分析成员变量方法参考链接本人的源码阅读主要聚焦于类的使用场景,一般只在java层面进行分析,没有深入到一些native方法的实现。并且由于知识储备不完整,很可能出现疏漏甚至是谬误,欢迎指出共同学习本文基于corretto-17.0.9源码,参考本文时请打开相应的源码对照,否则......
  • 【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)
    知识盲点概念介绍HashMap是基于Map接口构建的数据结构,它以键值对的形式存储元素,允许键和值都为null。由于键的唯一性,HashMap中只能有一个键为null。HashMap的特点是元素的无序性和不重复性。注意,HashMap并不是线程安全的。在多线程环境下,如果不进行适当的同步处理,可能会导致数据不......
  • HashMap源码随笔
    源码第一块:概述:Map接口的基于哈希表的实现。此实现提供所有可选的映射操作,并允许null值和null键。(HashMap类大致等同于Hashtable,只不过它是不同步的,并且允许null。此类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。此实现为基本操作(get和put)提供恒......