ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

hashmap源码分析

2021-07-20 10:34:01  阅读:151  来源: 互联网

标签:分析 扩容 hashmap 初始化 链表 源码 static 数组 final


1HashMap的存储结构在JDK1.8中 都做了哪些优化,Node[]数组

JDK7 数组加链表 JDK8 数组加树加红黑树  链表达到8时 并且容量达到64 会将链表,转成红黑树

static final int  TREEIFY_THRESHOLD=8

static final MIN_TREEIFY_CAPACITY=64

//转换链表的临界值 当元素小于此值 会将红黑树转换成链表结构,

static final UNTREEIFY_THRESHOLD=6

红黑树有啥特点?

2Hashmap没有初始容量,默认是多少

static final int DEFAULT_INITIAL_CAPACITY=1<<4//aka 16

  最大值为多少1073741824

static final int MAXIMUN_CAPACITY=1<<30

3加载因子 扩容的阈值

  1. 值是多少,
  2. 为什么是0.75 而不是别的值 出于容量和性能之间平衡的结果,当加载因子设置比较大的时候,扩容的门槛就被提高了,扩容发生的频率就比较低,占用的空间就会比较小,但此时发生Hash冲突的几率就会提升,因此需要更复杂的数据结构来储存元素,这样对元素的操作时间就会增加,运行效率也因此降低。而当加载因子值比较小的时候,扩容的门槛会比较低,因此会占用更多的空间,此时元素的存储就比较稀疏,发生哈希冲突的可能性就比较小,因此操作性能,会比较高,所以综合了以上情况就取了一个0.5到1的平均数0.75作为加载因子。

5什么时候链表转红黑树

链表达到8并且容量达到64时候 链表会转为红黑树

6为什么是2的幂

及时你构造函数时候 不传2的n次方,再后来的初始化方法中,也会强制变成2的n次方

让元素能够快速定位哈希桶,让Hash表元素分布均匀,减少哈希碰撞的几率

7若传入了一个初始化容量,则就是你传入的那个值吗?不一定,

是大于或等于你传入的那个值,离他最仅的那个2的幂的数

8put方法的流程

index:(table.length-1)&hash值 索引的计算公式,寻址公式。

9Node []数组,

   Node的属性有哪些,分别干啥用的

final int hash;final K key ;V value; Node<K,V> next;

10get方法

三种情况:直接数组中命中,需要在树中找,需要在链表中找

11扩容相关

(1)扩容原因

a为了解决哈希冲突导致的链化影响查询效率的问题,扩容会缓解该问题

b容量不够也要扩容

(2)扩容多大

a若原来Node[]就是最大值,不扩

b oldCap左移一位,实现数据翻倍,并且赋值给newCap,newCap小于数组最大值限制,且扩容之前的阈值>=16

12初始化容量一上来就初始化,还是put才初始化?put时候才初始化,跟Arraylist类似

13hashmap线程安全么?不安全 有没有安全的  ConcurrentHashMap

14说一说ConcurrenHashMap原理?

15 HashTable vs HashMap   hashtable比较古老,不用他,他线程安全。

因为hashtable如下 他直接锁方法,对整个数组加锁,力度过大

public synchronized V put(k key,V value)

16 ConcurrentHashMap

采用的是分段锁机制,通过synchronized锁定是代码块。

17 CopyOnWriteArrayList

写时复制容器 它在add方法中使用的是显示锁进行加锁, ReentrantLock

标签:分析,扩容,hashmap,初始化,链表,源码,static,数组,final
来源: https://blog.csdn.net/mayaohao/article/details/117537321

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有