Map集合、散列表、红黑树介绍

前面已经讲了Collection的总览和剖析List集合:

原本我是打算继续将Collection下的Set集合的,结果看了源码发现:Set集合实际上就是HashMap来构建的

Map集合、散列表、红黑树介绍

所以,就先介绍Map集合、散列表和红黑树吧

看这篇文章之前最好是有点数据结构的基础:

Map集合、散列表、红黑树介绍

Map集合、散列表、红黑树介绍

当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~

一、Map介绍 1.1为什么需要Map

前面我们学习的Collection叫做集合,它可以快速查找现有的元素。

而Map在《Core Java》中称之为-->映射..

映射的模型图是这样的:

Map集合、散列表、红黑树介绍

那为什么我们需要这种数据存储结构呢???举个例子

作为学生来说,我们是根据学号来区分不同的学生。只要我们知道学号,就可以获取对应的学生信息。这就是Map映射的作用!

生活中还有很多这样的例子:只要你掏出身份证(key),那就可以证明是你自己(value)

1.2Map与Collection的区别

Map集合、散列表、红黑树介绍

1.3Map的功能

下面我们来看看Map的源码:

Map集合、散列表、红黑树介绍

简单常用的Map功能有这么一些:

Map集合、散列表、红黑树介绍

下面用红色框框圈住的就是Map值得关注的子类:

Map集合、散列表、红黑树介绍

二、散列表介绍

无论是Set还是Map,我们会发现都会有对应的-->HashSet,HashMap

首先我们也先得回顾一下数据和链表

链表和数组都可以按照人们的意愿来排列元素的次序,他们可以说是有序的(存储的顺序和取出的顺序是一致的)

但同时,这会带来缺点:想要获取某个元素,就要访问所有的元素,直到找到为止。

这会让我们消耗很多的时间在里边,遍历访问元素~

而还有另外的一些存储结构:不在意元素的顺序,能够快速的查找元素的数据

其中就有一种非常常见的:散列表

2.1散列表工作原理

散列表为每个对象计算出一个整数,称为散列码根据这些计算出来的整数(散列码)保存在对应的位置上

Java中,散列表用的是链表数组实现的,每个列表称之为桶。【之前也写过,可以回顾回顾】

Map集合、散列表、红黑树介绍

一个桶上可能会遇到被占用的情况(hashCode散列码相同,就存储在同一个位置上),这种情况是无法避免的,这种现象称之为:散列冲突

此时需要用该对象与桶上的对象进行比较,看看该对象是否存在桶子上了~如果存在,就不添加了,如果不存在则添加到桶子上

当然了,如果hashcode函数设计得足够好,桶的数目也足够,这种比较是很少的~

JDK1.8中,桶满时会从链表变成平衡二叉树

如果散列表太满,是需要对散列表再散列,创建一个桶数更多的散列表,并将原有的元素插入到新表中,丢弃原来的表~

装填因子(load factor)决定了何时对散列表再散列~

装填因子默认为0.75,如果表中超过了75%的位置已经填入了元素,那么这个表就会用双倍的桶数自动进行再散列

当然了, 在后面阅读源码的时候会继续说明的,现在简单了解一下即可~

扩展阅读:

https://www.cnblogs.com/s-b-b/p/6208565.html

https://www.cnblogs.com/chinajava/p/5808416.html

三、红黑树介绍

上面散列表中已经提过了:如果桶数满的时候,JDK8是将链表转成红黑树的~。并且,我们的TreeSet、TreeMap底层都是红黑树来实现的。

所以,在这里学习一波红黑树到底是啥玩意。

之前涉及过二叉树的文章:

在未学习之前,我们可能是听过红黑树这么一个数据结构类型的,还有其他什么B/B+树等等,反正是比较复杂的数据结构了~~~

各种常见的树的用途:

Map集合、散列表、红黑树介绍

来源:
https://www.zhihu.com/question/30527705/answer/52527887

3.1回顾二叉查找树

首先我们来回顾一下:利用二叉查找树的特性,我们一般来说可以很快地查找出对应的元素。

可是二叉查找树也有个例(最坏)的情况(线性):

Map集合、散列表、红黑树介绍

上面符合二叉树的特性,但是它是线性的,完全没树的用处~

树是要“均衡”才能将它的优点展示出来的~,比如下面这种:

Map集合、散列表、红黑树介绍

因此,就有了平衡树这么一个概念~红黑树就是一种平衡树,它可以保证二叉树基本符合矮矮胖胖(均衡)的结构

3.2知新2-3树

讲到了平衡树就不得不说最基础的2-3树,2-3树长的是这个样子:

Map集合、散列表、红黑树介绍

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzxjw.html