快捷搜索:  汽车  科技

java中hashmap原理一定要懂吗?扩容流程讲一下

java中hashmap原理一定要懂吗?扩容流程讲一下下篇讲解:ConcurrentHashMap相关原理如果为8,当节点个数在8徘徊时,会频繁进行红黑树和链表的转换,造成性能的损耗。进行 put 操作,会进行计算当前hash表中的值容量先 后,如果大于等于初始算好的最大值(16*0.75f),就行行resize()扩容,扩容之后重新对每个hash值进行寻址。每次扩容之后,每个hash值要么是停留在原来的那个index的地方,要么是变成了原来的index(如5) oldCap(16)= 21

HashMap简单介绍

是一个"链表散列"的数据结构,即数组和链表的结合体。

JDK1.7以前是数组 链表,JDK8后加了红黑树,默认初始化大少是16,当存储大小大于了容量 * 负载因子( 0.75f)时,进行翻倍扩容,通过key来计算哈希值后做与(&)运算算出数组下标,如有相同的,就用equals比较对像Key值是否相同 相同覆盖原有值,如果不相同,就存成链表形式,JDK8后,当map里面的数据大小达到64并且链表长度达到8时,将链表转为红黑树。

1、为什么要将链表改成红黑树?

为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。

2、为什么链表转红黑树的阈值是8

主要考虑时间和空间的因素,红黑树节点大小约为链表节点的2倍,在节点太少时,红黑树的查找性能优势并不明显,算法问题。

3、为什么转回链表节点是用的6而不是复用8?

如果为8,当节点个数在8徘徊时,会频繁进行红黑树和链表的转换,造成性能的损耗。

HashMap扩容流程

进行 put 操作,会进行计算当前hash表中的值容量先 后,如果大于等于初始算好的最大值(16*0.75f),就行行resize()扩容,扩容之后重新对每个hash值进行寻址。

java中hashmap原理一定要懂吗?扩容流程讲一下(1)

每次扩容之后,每个hash值要么是停留在原来的那个index的地方,要么是变成了原来的index(如5) oldCap(16)= 21

插入流程

java中hashmap原理一定要懂吗?扩容流程讲一下(2)

下篇讲解:ConcurrentHashMap相关原理

猜您喜欢: