00:00
来,那咱们就继续了,各位啊,我们上节课呢,主要是把这个map这个接口当中的这个方法常用的我们说了一下,另外map集合的便利这一块呢,是非常重要的一个内容,希望下进去之后呢,大家一定要把它啊多敲几遍啊,多练几遍,因为后期开发我们最主要还是写代码啊,还是写代码,那怎么去便利这个map集合,对吧,有多种方式,你选一种方式。对不对?一种方式是先获取K,便利K,通过K来获取value,这种方式我说的效率可能比较低一些。那么还有一种方式呢,是把这个map集合转成set集合,然后呢,对set集合进行遍历,每变一次呢,取出我们这个节点对象之后呢,调用它的get key方法,调用它的get value这个方法是吧?哎,然后呢就可以怎么着啊。哎,就可以拿到它的K和Y6了,啊是这样,那好了,那么接下来咱们继续往下看各位啊。那么再往下呢,我们来看什么呢?我们看一下这个哈希map。
01:02
啊,哈希map,但是呢,在看这个哈希map这个集合之前啊,我们呢,得先去学一下这个叫做哈希表的这个数据结构。啊,我们得看一看含义表的这种数据结构啊。哈希map底层是单向链表,不是啊,是一个数组,数组里边放的是。哎,单向链表啊,数组当中放的是单向链表。来,我们看一看哈希表这种数据结构,看这个数据结构的话,我们得。嗯,画个图啊,是不是来,那么这边的话咱们保存一下啊,我们叫做day。叫做对30的一个哈希表。啊,或者有人把它叫做散表。数据结构。哈希表或者散列表这种数据结构啊。
02:02
嗯。好,那么这个哈希表它散列表,这只是个名字,各位别多想了,说是什么是散列表。什么是哈希表?它只是一个名字,你别多想啊,你要纠结这个名字的话,这个东西还没法解释,哈希表是因为它里边涉及到一个哈希函数。啊,老师哈,函数是个什么东西,这个不用你了解啊,不用你了解,咱们没必要去学那么深入啊。没有用,意义不大啊,哈希表,我们来看看哈希表是一种什么数据结构呢?它是一种。呃,数组和单向链表的一个结合体啊,数组和单向链表结合体,来我们这边呢,我们先新建个class啊,这个笔记这块我们看看记到什么地方啊,来这边我们写上哈西map test01。
03:02
一个哈麦出来啊。好,第一点啊,我们想说一下这个哈希map集合呀,它底层呢,是一个什么数据结构,先说一下啊,哈希map集合底层是哈希表或者叫散列表的数据结构。那么这个哈希map,呃,这个散利表或者哈希表啊,哈希表是一个怎样的。数据结构呢?啊哈希表是一个什么呀,是一个这个数组啊和链表和单向。链表的结合体。
04:00
那结合体单纯说数组。在。在什么呀,在查询方面效率很高。对吧,随机增删方面效率很低。是不是那么单向链表呢,它是在什么呀,在随机增删。方面效率较高,是不是,哎在查询方面效率。很低。是不是哈希表将以上的两种数据结构融合在一起?啊,在一起充分发挥,充分发挥他们各自的优点。哈希表是这样一个一个一个数据结构,各位啊,它是一个数组和单向链表的一个结合体啊,和单向链表的一个结合体,各位啊,那你想象一下它像什么呢?
05:08
它像那个珠珠帘子,你们知道那个门帘吗?门帘,你们家比如说我们家农村的啊,我们我们我们家挂那个门帘,夏天的时候挂那个珠珠帘子。猪珠帘是啥玩意儿?就是。门帘儿吗?是吧?这个。一道一道的。是不是?哎,然后里面有小小猪猪啊。小串珠啊,是不是珠珠啊,珠珠帘子你见过吗?应该见过吧?应该有同学见过啊。是吧,就这种的。嗯。上边这个呢,可以理解成是一个什么呀。
06:03
数组。啊,数组。数组中每一个元素。每一个元素。大蒜呢,现在基本没了,对,现在基本上没了啊,确实没了啊,嗯,这是一个单向链表。对吧,这是个列表,这个列表,这是个列表,这是列表。就相当于说你这有个数组。明白吗?能看懂什么意思吗?这是一个数组。然后呢,数组当中的每个元素是一个node。这个node里边有什么呀。那这个no,这个节点里有什么,有这个这个。有存储的这个value。
07:00
啊,还有下一个节点的内存地址。你好好想一想,是不是是不是是不是这样一个情况。我们这个里边应该有一个数组。是不是啊?这个数组中存储的每一个元素是node?那每一个node呢?它都有下一个node的内存地址,而且在这个node当中,它存储了这个K和这个value。想想。是吧,那这块的话我们可以看一下门铃猪猪铃啊。来点过去。是不是?那么这块有没有。你看就从这儿看嘛,这有个no的数组,看见了吗?哎,Node数组,来看看还有没有别的地方,有没有以属性的形式存在。Node数组。
08:02
再找找。这是哪个方法?你看是不是node数组啊,里面有node数组是不是啊。你看底层还有树呢,是不是这是红黑树啊,红黑树。来,你看都是no的数组吧,Clear,你看清空清空啥呀,这有个清空,实际上是清空这个数组对不对?你看这个数组叫tab,下标为I,怎么着给它清空掉对不对?你看有很多数组对吧。来包括什么呀?我们判断是否包含这个value。是不是也是这个node数组啊?是吧,这种。再看。你看是不是啊。全是note数组。
09:03
啊,有这样的方法。Lap。No,对吧,Key value。是不是都是。迭代器对吧,迭代也是谁呀,这个数组吧。对吧。对对,都是。找找找。再走,再走,再走,再走,走。是不是?数组啊。你看。看这。对吧,哎。这是一个什么呀,属性吧。是不是你看。前面这个单词你不认识没关系啊,后期讲IO流的时候你就知道了。它底层是不是这么一个东西,这是一个哈希map啊,底层是一个node数组。
10:00
哈希表。对不对啊,实际上它底层的代码。我们可以拿过来啊,放到这儿。就哈希map集合底层的源代码结构public class有个哈希map,在这个哈希map当中,它有个什么呢?有这么一个东西。有这么一个东西啊,前面那个穿刺的去掉吧,你看不懂,看不懂咱就先不说啊,然后这个里边呢,它有一个什么呀,叫做内部类。我们可以从里面找找。对吧,CTRLF吧,嗯。是不是,哎,我们叫做node,哎,你看就这个呗,静态内部类你看。是不是来拿过来,然后放哪儿啊,放这儿吧,静态累不累?这个静态内部类,这是啥。哈希,Map底层实际上就是一个数组,而且还是个一位数组,看见没有?
11:01
是吧,它是个一位数组。然后这个一维数组里边存的存的元素是什么呀?是node。Node,这就是那个node啊,这是一个静态的内部类啊,叫做哈希map.node就这个类名哈希map.node啊这个实现这个接口咱就不管它了,好吧,最关心的最重要的就是你这个node这个节点,它里边有什么呢?嗯。我们从这个原代码上看一下,它里边有四部分组成,一个是int类型的,什么哈施是吧,实际上这这就是哈希值。这就是哈希值啊,然后呢,这个是什么是K。对吧,这个是什么?这是然这是一个节点内存址。拿出来放到放到这儿啊,咱们看一下。没事啊,我先去说,说完之后呢,我再去给大家画图啊,让大家去理解这个东西啊,那这个呢,每个节点当中这是什么,这是哈希值。
12:03
哈希值啊,这个哈希值啊。哈西指是是什么呀?是K的哈西扣的方法的执行结果。注意啊,这个哈希值是这个K,它的哈希扣的方法执行结果就是这个哈希值,哈希值通过哈希函数。或者叫算法啊,可以转成数组的下标。那当然有同学,老师这里有个哈希算法这个东西,咱们要不要研究一下,这个现阶段就算了,各位啊,现阶段就算了,因为咱们研究这个哈希算法可能得研究一天。啊,研究这个算法的,研究是算法咋回事咋回咋回事,是不是,那这块的话,咱们知道在我们的一个哈希map当中,是一个一维数组,一维数组当中存储的每个元素是个no的,每一个node上有四个属性,有一个哈希,有一个我们的一个K,还有一个value,还有一个ne,是不是啊,那么这个哈希呢,其实就是哈希值,哈希值其实就是我们这个键,它的哈希扣的方法,执行结束的一个结果就是哈希值,而我们哈希值通过哈希算法可以转换成数组下标。
13:26
啊,可以转换成数组的下标,或者说哈希值就代表数组下标,也可以这样去理解啊,这个就是存储到map集合中的那个K。啊,这个呢,就是存储到那个map集合中的value中的那个value,各位啊,这个是什么呢?这是哎,下一个节点的内存地址。显然,这是一个什么呀?一维数组,一维数组当中每个元素是个单向链表。
14:01
对吧?啊,一为数组哈希表或者叫散列表啊,是一个一为数组啊,这个数组中每一个元素是一个单向链表。啊是数组和链表的结合体,数组和链表的结合体啊,结合体就通过原代码当中,我们可以看到这些东西啊,可以看到这些东西来这边呢。我删一下啊好。
我来说两句