HashMap笔记--底层结构

背景:

HashMap是数据结构中一个非常重要的知识点,如果能很好的理解它,对于在今后对其应用以及找工作面试中都会有很大的帮助,因此写这篇文章来归纳一下自己对于HashMap的学习。

本篇笔记主要是分析一下HashMap的底层结构。

HashMap介绍

1.HashMap是用于存储key-value键值对的集合;

2.HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,所以具有很快的访问速度,但遍历顺序不确定;

3.HashMap中键key为null的记录至多只能有一条,值为null的记录可以有多条;

4.HahMap是线程不安全的。

HashMap的底层结构

HashMap的的结构是由数组+链表+红黑树(JDK1.8之后增加了红黑树部分)实现的。
在这里插入图片描述

图1.HashMap的结构

数组:
HashMap是一个用于存储key-value键值对的集合,每一个键值对也叫一个entry;这些entry存储在一个数组中,该数组就是HashMap的主干。

链表:
因为数组table的长度是有限的,并且不同的key可能会具有相同的hash值,此时通过hash值计算出来的索引就有可能会相同,这种情况称为Hash冲突。而为了解决这一现象,就需要链表来解决冲突,数组Table中的每一个元素不单纯只是一个Entry对象,它还是一个链表的头节点,每一个Entry对象通过Next指针指向下一个Entry节点;当新来的Entry映射到冲突数组位置时,只需要插入对应的链表位置即可。

红黑树:
红黑树是JDK1.8之后增加的,当hash冲突较少时,使用链表来存储,但当冲突数量变得很大之后,链表的查询效率就会比较慢,因此为了增加效率,将链表变成红黑树就可以很大的提高查询效率。一般在链表长度大于8时就会转换成红黑树。

但问题来了,竟然红黑树的查询效率比链表高,那为什么不一开始就使用红黑树呢?

通过查找资料得知,这是基于时间和空间的权衡。TreeNodes占用空间是普通Nodes的两倍,所以只有当链表中包含足够多的节点时才会变成红黑树,而是否足够多就时TREEIFY_THRESHOLD的值决定的。当红黑树中的节点数变少时,就会转成链表。

本篇笔记的内容就暂时到此,下篇笔记内容是进行HassMap中索引的计算以及HashMap的put(key,value)、get(key)方法的详解。

第二篇笔记链接:HashMap笔记-索引计算及基本方法流程分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值