00:00
行,那么接下来呢,咱们说的就是这个set接口,它存在叫无序的不可重复的数据,我们怎么去理解这个无序和不可重复啊,这呢是咱们的一个重点啊呃,这个清楚以后呢,其实这块呢非常简单,跟咱们讲历史那块还不太一样啊,这里边的源码呢,其实我们就不去看了啊呃,因为嗯,咱们开发当中呢,一来用这个set呢,用的其实比较少,咱们开发当中呢,用list比较多,用map比较多,用set呢比较少,所以我们就不都去看源码了,这是其一,其二的话呢,这个set跟我们后边讲的map有关系,我讲完map呢,咱们看完源码,其实赛呢自然而然大家就都懂了,相当于呢是代码就都看了哈,那这里边儿呢,我们的重心在哪呢?就是大家呢,得去理解它这个无序和不可重复,所以我们把这个呢,当成咱们讲set的一个重心,好我在这块呢去写啊,这个set提到了它。
01:01
存储的数据无序,不可重复。那么我们如何去理解它的无序性,哎,然后以及如何去理解它的叫不可重复性。哎,说这样两个事情,那么首先的话呢,我们先呢,体会一下它的一个简单使用。这呢我写一个测试啊,测试左边呢我写一个set,右边呢,咱们不妨就拿它的一个最主要的时间类呢来讲,叫哈希set,哎,就说一下这个哈希set,然后我们往这个set当中去添加这个操作。这块的话呢,我们顺便说一句啊,顺便说一句什么呢,就是咱们这个我写到这吧,这个set呢,作为一个子接口啊,这个接口中没有啊,这个额外的定义新的方法。那那young呢,我们使用的,哎,都是咱们collection当中,哎声明的声明过的这个方法啊,跟这个list不一样了,List咱们刚才讲了一波新的方法,因为人家有索引,那你赛呢无序的,那你也没有索引了。
02:16
啊,没有顺序就没有所谓的索引,没有索引呢,这块也没有什么新的方法啊,咱们都是collection当中定义过的,那这块咱们就调一下这个像爱的方法,爱的往里边添一个,比如456这块,我们多整几个这个123整一个,这个看AA。整个这个,比如说CC我随机写的啊,嗯,再来两个吧。嗯,你有一个Tom这个十二十二岁啊,123岁了,诶12岁这个呢,再来一个这个,嗯,12吧,啊三位数啊129吧,好这样的话呢,咱们就添了这样的几个数据,一共是六个啊贴完这六个数据以后,首先呢,我们关心诶无序情。
03:14
说无序是不是说这个便历的时候呢,就不按照你添加的顺序来了呢,咱们可以看一下,那这块呢,咱们就做一个便利,便利呢,我们再去熟悉一下,这个叫迭代器。行,这我就写完了,写完以后我现在去执行,执行出来了,出来以后我们跟添加的这个顺序呢,稍微做一个对比,你看456还不一样是吧,确实呢有区别,那么好了,我问一下啊,我再去跑一遍,你说这个顺序会不会跟这个还不一样。看看一样不一样,有同学没注意没注意你,这会你注意一下。
04:10
是不是一样啊,有同学说这巧合巧合你就跑吧,哎,你这个再跑它也还是这样啊,所以首先我们明确一个点,这个无序性啊,它呢不等于这个随机性啊。它可不等于随机性,这条先明确,它其实你便利的时候,它也有一个,呃,所谓的这个顺序啊,每次都是这样子的顺序,那么这个这什么叫无序性呢?呃,这个什么叫无序性,我们还是确实得需要解释一下啊,否则的话呢,大家就会,呃有这个错误的理解,比如说呢,有人问到了,说你这个link list,一会咱们讲这个的时候,你会看到这哥们的话呢,我们这个你把这个改成叫link list。啊,你看啊,我这给你改一下改成啊,这这还给我又加了一个,我改成这个link的list以后。
05:04
又就也没了,这个时候呢,我去做一个执行,你会发现呢,我填的顺序就是我们便历的顺序,那如果有人问说这个link的link link的哈希set,我呢,便历的时候呢,呃,添加的时候跟我遍历的时候呢,顺序一样,每次执行都这样说,这不就是个有序的吗。这怎么还叫无序呢?这个时候你看了看,他说说的有道理是吧?啊,这就没法解释了啊,那这里边你就得清楚什么叫无序性啊,它不是说呢,我们便历的时候呢,跟你签的时候顺序一样,这叫有序,不是这个意思,那我们就得知道它到底指的是什么意思,哎,到底指的什么意思呢?我们说它是相较于咱们讲的这个这个这个list list呢叫有序,就是我们先就典型的咱们就拿这个数组来说,数组的话呢,我第一个元素就放到这儿,第二个呢,紧挨着它放这儿。
06:07
再来一个呢,紧挨着它放这儿,这样这样这样这样这样这样下去,这呢叫有顺序,哎,对,这样叫有顺序,那就好比是咱们比如说教室里边某一排同学吧,是吧,这一排就像一个数组一样啊,第一个人来了,就就往往里边坐,第二个再往这坐啊,一个一个这样下来。啊,这呢叫有顺序啊,那那咱们便利的时候呢,恰好呢,就是按你按照你是按照这个从头这个位置来的,所以一个一个呢就出来了,那什么叫无序性呢?咱们以哈希set为例,那我先告诉大家,哈希set它的底层也先是用数组存的。它也是用数组存的,好,那我们首先呢,给你整个数组。长了一个数度以后啊,这个数组长度是多少呢?你可以这个点开看一下。坏了,这一看让大家看多了,看到一个新的东西看是吧,嗯嗯,这个再往里边看,这呢,咱们看的是这个这DK8当中的了,这个八当中这块又有点区别了啊,那我先告诉大家吧,这个七当中的话呢,那七跟八有点区别啊,这个先说七当中这呢,其实一开始底层创建的数组长度是16啊,数组的长度是16。
07:21
那我们又一开始有一个哈希set,数组的长度是16。好,掉线了是吧,这个好了吧,嗯,好了,行,那么我们一开始这个数组的长度是16 16以后我们添加的第一个叫456,这个456呢,不在第一个位置,那四六在哪呢?456呢,可能在这儿,哎,假设就在这儿了,然后呢,你再填的第二个元素,第二个元素呢,诶,它可能是在这,第三个呢可能在这儿,第四呢可能在这儿,第五个呢,可能在这儿,从这个角度来讲,它是无序的。不是像那样啊,一个一个一个这样放的,哎,这是第一个,这是咱们的第二个,这个呢,我说这是第三个啊,这是第四个,这是第五个是这样放的。
08:11
那所以呢,使得它表现出来一种叫无序的一种特性。啊,是这样子的啊,哎,我们在这说明一下,不等同于随机性,那什么叫无序性呢?首先呢,我们嗯就在这儿,我们在这先强调一下啊,这个以呃哈希set为例说明,毕竟呢,咱们这个吹ET呢,它底层不是数组了,那么这里要说明的就是嗯存储的数据,呃在我们数组中并非。冰粉啊,并非啊,哎存储的数据在底层数组中,哎并非按照这个先,呃,并非按照什么呢,这个数,数组这个索引的这个顺序,哎,去做的添加啊,那不是按照这个顺序添加的,我们按照什么?呃,什么这个值决定它在数组中哪个位置呢?我们要提一个方法,叫做哈西扣的方法啊,需要呢,根据你要填的这个数据的这个哈希值来决定在数组中的哪个位置,而不是说呢,就是一个挨一个这样放。
09:20
并非按照数组索引的这个顺序添加,而是呢,诶,根据这个数据的这个哈希值。好其值啊,这个决定的。哎,这个呢,哈希值,咱们一会儿说这个事情,这是第一个问题叫无序性,哎叫无序性,那么接下来下一个问题叫不可重复性,说呢,我们往这个set当中添加的数据呢,是不能够重复的。我们试图再加一个123,好,再执行。诶,你看这时候呢,是不是就没有了,就只有这一个123,那再问一句,我这拗了个person,这个person的话呢,别扭person了,换一个吧,咱们在这里边呢,再重新去造一个类,我这个呢,就叫做user,哎,换汤不换药,还是这个属性,String的一个name private in型的age啊,然后接着提供基本的几个结构。
10:31
哎,Get set方法。然后再来一个to string。行写完了,那注意我这时候呢,我没有去重写这个equals啥的啊,然后回过来。回到咱们这个side这块,我这呢不去new person了,我去这个user。咱们刚才造这个,这呢只有一个user,我现在呢,Control下再拗一个,那么问我现在去执行,你说有几个U,哎,同学有两个了。
11:09
这就涉及到怎么叫不可重复的这个点啊,真有俩啊,那么通过这个呢,你来想一想,或者我们来说明一下怎么算叫不可重复,就言为这你不能放重复的,那目前呢,它就把这当成是两个不重复的对象了。怎么判断的呀,对,你看人家这个就没有啊,咱这两个呢,判断的时候发现就认为不一样了,是因为你这两个对象的地址是不一样,或者换句话说呢,主要原因是因为咱们这个user色当中啊,没有去重写那个equals对吧?好,我现在去重写一下ctrl shift s这个大家注意这块呢,呃,有点这个讲究了啊,我点一下。这个呢,咱们选哪个都行。全脸都可以,这个也可以,下边的也可以都行,那next next next finish好,写好了,写好了,暂时这个咱们不是说先用不着吗?我先注释一下,注释完以后我们先使用的是上面这个ES啊,我写完了,为了证明咱们确实掉过我这块呢,再输出一下叫user的一个。
12:20
Equal的方法这样子回过来。回过来以后,我们现在这不是去调这个ADD的ADD的,那么问大家觉得这个时候呢。有几个,嗯,还有两个一个吗?两个呀,来以结果为准走。还是俩还是俩,而且呢,你会发现连这个E扣子掉都没掉。那你可能会得到一个结论,说这个是不是不是拿equals判断的,对,有同学呢,可能提前看过啊,哎了解过就知道呢,哎,其实呢,我们这个不可重复性的,其实还是拿这个equals来判断的,只不过呢,我们不是马上上来,就像咱们前面讲那个list一样哈,诶我里边呢,去比一下有没有这个元素,哎一个一个从前往后去找,没有这样去整啊,那这块呢,我们就先写一下啊,这个不可重复性表示呢,就我们像S中添下元素呢,是不可重复的,那怎么证明这个重复不重复呢?我们其实本质上来讲,仍然是拿的ecos做的比较。
13:34
啊,只不过呢,这个比较呢,它还有一个前提,还会涉及到一个诶这个地址的一个问题啊,这就是关于这个哈希扣的情况,所以呢,当我们把这个呢,打开的时候,会打开了,打开以后呢,我们再来执行。这个时候呢,我们看到呢,就只有这一个了,同时呢,这E还执行过。啊,说明呢,确实判断重不重复呢,还是要用到ES的啊,在这先写注明啊,注释不可重复性就是保证添加的这个元素。
14:07
哎,添加的这个元素啊,怎么着呢,就按照这个equals方法啊,Equal方法判断时啊,判断时啊这个哎不能哎返回处。嗯,你要返回处了,就认为你这两个对象呢,是相同的了。啊,不能返回出,只能返回你往前推,就是相同的元素呢,就不能够去添加进来。啊。嗯,什么呢?就是相同的元素,哎,不能,哎,就是已经存在一个元素了啊呃,相同的元素呢,只能添加一个啊。这呢就叫不可重复性啊,那么大家呢,肯定是怀着很多的疑问啊,说这里边怎么还要写一个焊气扣的,那他为什么要这样设计啊,我们呢,等一下过来去解释一下,说到底这个哈希set里边这个艾的时候呢,它到底是怎么存的啊,这呢就是我们一会儿呢过来说的事情。
我来说两句