HashMap系列之基本概念

Posted leiger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap系列之基本概念相关的知识,希望对你有一定的参考价值。

理论概念

  1. HashMap基于哈希丟的Map接口实现,是以key-value存锗形式存在。它是线程不安全的,key值和value值允许为null。
  2. JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的,哈希冲突是由于两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同引起的,通常采用“拉链法”解决冲突。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(或者红黑树的边界值,默认为8)并且当前数组的长度大于64时,此时数组各数据的索引位置改为使用红黑树存储。

JDK1.8链表变红黑树的情况

? 当数组阈值大于8,长度小于64时,链表不会变红黑树,而是数组进行扩容,一般为原数组的二倍。只有当阈值大于8,数组长度大于64时链表才会变红黑树。

? 这样做的目的是因为此时的数组长度较小,尽量避开红黑树结构,这种情况下变为红黑树结构,反而会降低效率,因为红黑树需要进行左旋,右旋,变色这些操作来保持平衡 。同时数组长度小于64时,搜索时间相对要快些。所以综上所述为了提高性能和减少搜索时间,底层在阈值大于8并且数组长度大于64时,链表才转换为红黑树。

? 当阈值大于8并且数组长度大于64时,虽然增加了红黑树作为底层数据结构,结构变得复杂了,但效率变的更高效。

总结

1.存取无序的

2.键和值位置都可以是null,但是键位置只能是一个null

3.键位置是唯一的,底层的数据结构控制键的

4.jdk1.8前数据结构是:**数组 + 链表 ** jdk1.8之后是 : 数组 + 链表 + 红黑树

5.阈值(边界值) > 8 并且数组长度大于64,才将链表转换为红黑树,变为红黑树的目的是为了高效的查询。

持续更新中

HashMap系列之底层数据结构

以上是关于HashMap系列之基本概念的主要内容,如果未能解决你的问题,请参考以下文章

Spring读源码系列之AOP--02---aop基本概念扫盲---下

spark系列之基本概念

ShardingSphere系列之基本概念学习笔记

ShardingSphere系列之基本概念学习笔记

ShardingSphere系列之基本概念学习笔记

Java多线程系列--“基础篇”01之 基本概念