HashMap源码学习记录(一)

1、HashMap是什么
HashMap是Map的一种实现类,那Map又是什么呢?Map是描述一系列的key和value一一对应的数据结构;而HashMap则是实现了key和value键值对存储的容器及一些列相关操作(具体操作可见本文的源码中关键方法),且key和values都允许为null,说了这么多是不是还是不清楚他到达是什么?那下来就是干货,它是:
A、整体是一个数组,且数组下标是key的hash值
B、数组每个位置是一个链表;但当键值对个数大于树阀值TREEIFY_THRESHOLD(8)时,则数组中存储的是红黑树
C、链表每个节点中的Value即我们存储的Object;
具体结构如下:
在这里插入图片描述

2、为什么要有HashMap
在知道这个问题前,我们先屡一下JAVA中的集合类(存储数据的数据结构)有哪些,有数组、ArrayList、LinkedList、Vector等等,但是其上每个都有类型都有相应的缺点:
A、数组:需要实现前确认大小,不支持扩容
B、ArrayList:支持动态扩容,但是插入效率低,平均时间复杂度为O(n)
C、LinkedList:插入删除虽然效率高(T(n)=O(1)),但是查询效率低,平均时间复杂度为O(n)
那有没有即可以动态扩容且插入、删除、查询都效率高的集合呢?为了解决这个问题HashMap就出现了,其解决的方案是:
A、为了提高查询速度,HashMap通过数组来存储
B、为了提高插入和删除效率,在数组中存储链表方式
C、为了解决动态扩容及HashMap本身引入的冲突问题,当冲突大于8时,则将数组中存储的链表变化为红黑树,来提高查询性能,以将链表 O(n) 复杂度的查找效率提升至 O(log n)

3、HashMap怎么样,使用它有什么优势,使用场景
知道引入HashMap的背景及解决了什么问题后,其动态扩容、插入、删除效率高优势也就显而易见了,那么开发中一般用他来存储对象的json串比较常见

4、源码学习见HashMap源码学习记录(二)

猜你喜欢

转载自blog.csdn.net/HashMap_Set/article/details/111377799
今日推荐