00:00
行了,那咱们接着往下看吧,那这块咱们再往下看谁呢?我们还得看一看我们集合当中的这几个,这个方法有一些东西我们得吃透了。啊,就是这个contains方法,我们看一下contains,还有这个remove,我们这两个方法着重的看一看。其实这两个我们可以学到更多的东西。啊,更多的东西,我们把这个接口里的方法讲了,我们把这个迭代器的事儿说了,是吧?哎,我们把这两个看一下行吧,先看一下content方法,我们深入一下啊。深入一下方法。来。这边的话我们创建一个class,这个class我们叫collection。Test。零四。来这块呢,我们写上去一个注释,我们要深入一下什么呢?深入collection。集合的。呃,哪个方法呢,叫做contains方法。
01:03
这个方法呀,我们拿过来研究研究啊,研究透彻一些。Collection吧,是不是,哎,这块有个什么叫做contents。那么这个方法呀,它最主要是干什么的呢?是判断集合中是否包含元素。是不包含某个对象O你看是吧,如果包含返回处吧,是不是,如果包含返回处。如果不包含返回false,我们来深入一下,现在我在这有个集合collection。那么new一个list new完之后呢,该倒的咱们导进来,来这块也一样,咱们导进来,那这个其实就是创建什么呀,集合对象是不是,那么接下来呢,我们在这块呢,调一下c.ADD,我们添加元素,我们加元素的时候怎么加呀,我一个string出来。
02:12
注意听课啊,这个叫ABC我给进去。哎,这是一个对象,是不是扭出来了,大家注意听啊,润S1等于new扭完之后把S1放进去。然后接下来呢,哎。我们判断一下。这儿呢,String s2new一个string。叫做DEF啊,拗完之后啊,怎么办呀,我c.I的把S2也放进去,也就是说我现在啊,这是像集合中存储元素吧,是不是?哎,拗了一个放进去S1,又拗了一个放进去S2,现在这个集合中元素的个数是几呀?我们可以看看c.S是不是?哎元素的个数应该是二吧,是不是放进去两个呀?哎元素的个数是什么呀?是几啊,是二来走一个。
03:15
好,大家看我现在是不是扭了两次啊string吧,哎,放进去S1和S2,放进去S是是两个,那么这个时候呢,我在这里string现在有个X new一个什么呢。六论这块什么呢?写个ABC,那么现在我输出我C集合contains X这个结果大家猜测一下是true呢还是false呢?猜测一下。就是这个是我新建的对象吧,是不是新建的对象啊吧,是不是好,那么判断一下C集合中是否包含X。那么这个结果猜测一下,结果猜测一下是true还是false。
04:04
你上面这个的集合new出来了,New了一个string s1放进去了,扭了一个string s2放进去了。是不是?哎,那么size是二啊,里边有两个元素啊,现在我又扭了一个,String是新new了一个对象吗?然后X放进去,它包含X吗?它这个集合C里边包含不包含X?放放吧。有处有内存,地址不一样。确实是啊,有道理,这是不是new了一个对象啊,S1是不是一个内存地址啊,S1里边是是0X1234吧。0X,假如说1111这个呢是什么X2对吧?是0X2222,到了这儿之后,你又扭了一个磁钝,这个X呢,等于什么呀?哎,等于0X5555,你扭了三次啊,这是个地址S1是不是SS2呢?
05:09
是不是也是个地址啊。对吧。嗯,你看这是不是又溜了一次啊,又是个新的地址吧。那你说我这个C集合里包含X吗?我只把S1和S2放进去了,那包含不包含X呢?对吧?我调一下大家的胃口,我问大家一个问题吧,各位。我们字符串这个东西。如果x.EQUALS1的话。就这个X啊,现在假如说点equals SE的话,最后的结果是true还是false?告诉我。字符串的比较是不是会掉equals方法。
06:02
啊。好,大家改改了是吧,哎,你看都改了啊,都改了是true是不是来你的猜测非常正确,恭喜你猜对了啊,恭喜你猜对了,我说一下啊,虽然你这个X是拗出来的,但是你这个字符串代表的也是ABC,你看见没有?是吧,你那你这个C集可能包含不包含这个X啊。你不是放进去一个ABC吗?包含不包含ABC啊,所以我想知道这content方底层有没有调E方法。我们可以看一看行吧,咱说别的都没用各位啊。不,不是跟常量池没关系,以往常量跟常量池没有半毛钱关系啊,跟常量池没关系,因为是new的对象都在堆里边呢。都在堆里边呢啊,我们重点看contains方法。明白什么意思吗?看他底层到底怎么判断的。
07:02
就你这个内存图这块我觉得。来咱们再看一下啊。你是不是了一个S1。咱先不讨论了,各位注意听课了。听我去讲,咱们先不运行啊,先不运行,等我们推出来,然后你再再再说行吧,先不要发表你的你的结论了啊。保存一下。DAY28的一个叫做方法啊,叫collection。Contains方法。这个方法的原理啊,首先我们来看一下,瞅一眼啊,我们大概画一下得了又一个string吧,是不是地址付给S1。
08:09
那这个图应该是怎样的呢?大概一下啊。这个是这。对吧。这是方法区。是吧,这是堆呗。这是什么呀?但。方法去啊。对在吗。好了,那么这个程序首先上来第一件事是闷方法执行,所以我们在这儿压站就行了。压榨啊,这是我们的一个焖方碗战针,然后接下来这个程序呢,它是collection c等于。底层是数组。明白吧。所以这个时候我们底层建。
09:02
实际上就是一个。这样看嘛。哎,这就是那个release的对象啊,Release的集合对象底层它是个数组啊。然后这块呢,我们。画一下。换一下啊。一下大概是这个意思啊。然后呢,这个集合呀,它是数组0X12是吧,这个是0X13呗。这是0X14,因为它是数组嘛,R1的底层是数组啊,0X15大概是这样画啊,内存地址是连续的,那扭出来之后呢,接下来我们这个集合给了C。这个C是谁呢?其实就是个局部变量,在这块呢,它是个哎局部变量。对吧?哎,那么这个局部变量里边保存了一个内存地址,是不是,哎,这个内存地址保存的是0X12,那么这个0X12呢,就指向谁呢?指向了我们的这个对象。
10:01
对吧。哎,这是我们当前这个程序是长这个德行,那么接下来呢,我们这个程序再往下走是string new string,然后ABC带双引号的东西,在这个字符状常量池里边是必一份吧。对吧,哎,这个呢,我们叫字符串常量池。常量池先不用管它,那么这块呢,其实有一个ABC。啊,然后ABC呢,其实就是个对象喽,那么这个对象呢,它呢new了一个string。明白吧,News症呢,就导致我们这里有一个什么呀,字符串对象。对象。这是一个string对象啊,来写上string对象,那么这个string对象。它其实里边有一个变量,或者有一个引用是吧,0X33。那么这个0X33的去指向谁呢?实际上是指向了这个。啊,咱就不用了。是不是好,那么接下来这个对象的内存地址是不是付给了我们前面那个S1啊。
11:06
对吧,S1啊,那么这个时候呢,我们就相当于在这儿呢,有一个string s1,然后呢,这个S1呢,它这个变量里边保存了一个内存地址,这个内存地址呢,假如说是0X99,而这个0X99呢,其实指向的是谁啊,就是我们这个死存对象啊。对不对啊,这个地址是这个地址,这个地址是这个对象的地址。然后接下来他做了一个操作,叫S1加到C里边c.AD1C是谁?C是它呀,它指向的是这个对这个对象啊。对吧,c.ad的一把S1加到第一个位置上,所以这个位置大家想想是不是就是0X9。对吧,你S1嘛,你把S1是不是放到这个地方啊。加进去了,你调的这个方法吗。
12:01
是不是,那你这个地方的0X99就指向谁啊?你0X轴就指向它,所以这个0X轴就肯定指向它没跑对吧,肯定是指向这个死顿。对象了,那么接下来这个程序继续再往下走,是string s2等于new string,然后有个DEF,那这个DEF说白了就相当于是在这个位置上应该是有一个哎,我们叫做DEF的东西,那么DEF呢,又是一个字符串常量池里面一个对象,那么这个对象呢,接下来就在这拗了一个string嘛,所以这个时候呢,实际上跟这个命运是一样的,我们在这儿有一个什么呀,死顺对象。对吧,这有个string对象来。那么这个string对象呢,它其实里边保存了一个地址,这个地址是0X25吧,假如说那0X25呢,它就指向谁指向了这个呀。对吧,好指向了DF2,那么接下来呢,我们紧接着这个对象的内存地址就付给了S2呢,所以S2就在这儿喽,那这一块其实就是S2喽。
13:00
好,那S2呢,它里边保存一个内存地址呗。对吧,哎,这个地址呢,可能就是这个0X,比如说0X,呃,七七,这个0X77指向谁呢?指向这个对象呗。是吧?哎,指向这个对象,那么接下来这个程序再往下走,应该是c.ADDS2,那S2加到集合里边,实际上就相当于这个S2加到这个集合里边,那这个是0X77,那么这块其实就是0X77喽,对吧?那这个0X77去指向这个对象,这个0X7也指向这个对象呗。是吧,也指向这个对象对不对?你想想是不是这个道理,好,那么接下来这个程序继续再往下走,走的是什么?是又扭了一个string,有一个ABC,对吧,那ABC实际上是在这儿有个ABC,但是这又拗了一个新的,什么意思?又拗了一个新的,各位。明白什么意思啊,New了一个新的就意味着说这块它会有一个新的string对象。明白吗?来这写上啊,它是一个新的string对象,各位又出来了,来string对象,那么这个string对象呢,它里边保存的一个内存地址和这个一样,这是0X33去指向它,那这块呢,其实也是0X33对吧,而这个0X33去指向了同一个吧。
14:14
指向了他。是不是哎指向了它,指向它之后呢,接下来这个对象创建完之后呢,付给了谁呀?哎,X,那么就相当于在这块有一个什么呀,哎有一个X,注意听啊,在这有一个string X,那这个string X呢,后边等于什么呢?等于这个,比如说0X什么呀,九九啊九九是是不是有了0X94,那这个0X94去指向谁呢?去指向了它。明白什么意思吧?哎,指向了它,那么接下来我问大家一个问题,这个X我是不是并没有加进去?我这个X是不是并没有进去。没有放进去吧。没有放到这个集合里边是不是。你看我没放啊,我是判断这个集合C里面包含不包含X。
15:05
包含不包含?这个集合里边包含不包含这个X。各位。包含不包含?思考一下。C。集合包含X吗?那要看他底层是怎么比的。还是不包含,哎,说的有道理啊,我讲到这,你应该感觉到什么不包含。对C包含X吗?不包含X,因为X没进没放进去啊。对吧,那最重要的问题还是什么,还是看你底层这个contains方法在写的时候。底层源代码分析,为什么我在这磨叽这么长时间,那得看源代码它底层是怎么比的。
16:05
明白吗?就是它包含这个X还是不包含X,是是说你这个集合里边包含这个内存地址呢,还是说拿的X,他认为是S11就是XX就是X1是同一个。因为你X1指向了什么呀,我们一个对象ABC,而X1指向也是,虽然用了一个新的对象,但是你这个字符串毕竟也代表是一个什么呀。ABC吧。是吧,你把S1是放进去了是不是?他问你包含不包含X,那要看底层掉没掉ES对吗?大家思考一个问题,就是说这个里边是不包含X,这确实不包含X对吧。没问题吧,那要看你底层调方法的时候调没调ES,因为我问大家问题,Equals方法比较内存地址吗?
17:01
我的equals方法,此类的equals方法比较的是内容还是内存地址呀。内容你们都知道是内容是吧,那行,那这一块咱们得看一下content方法了,各位啊,点过去啊点过去好,我问大家这个是不是release集合里边contains啊,点到这个a list里边 CTRLf12找一下contains。Contains方法点过去啊,好,大家看contains方法是不是掉了index of。Index of又掉了,这个index of是吧?好,这个index of在底层,掉没掉equals。这个是不是就是那个集合里边存储的那个元素。
18:03
而这个O是不是就是这个方法上的参数?好,我问大家问题,这个代码能看懂吗?这个O是谁?是不是一个参数啊。E是谁?这是那个集合,集合是是个是个数组吧。这个release的集合,再往上看看是不是它是不是底层有个数组。对吧。啊,再来。Cons。Contains方法是不是OJ传进来了?
19:01
好看看啊,我现在是不是调contains这个参数传的X吧。这个X传给了谁?是不是O,这个O是不是就是那个X。去吧。是不是这个方法调的是这个。好,这个方法在这儿是不是有个O,这个O是不是就是那个X。这个X是不是就是那个O。对吧,然后O呢,在这点ES数组当中的元素吧。那你把这段代码拿过来,它是什么意思啊?来拿到我们这里看一下啊。这个代码来告诉我O是谁?X。好好想想。这个就是这个。然后ES中括号I。
20:04
是谁?是不是S1。思考一下。大家这个啊。这个O。是不是就是这个X。然后ES后边有个数组下标为I的元素,是不是就是我们这个数组下标为I上的这个元素叫0X99。而0X9是不是就是一?那我问大家一个问题,X点。Equals括号里面传一个S1。这个结果是不是处?大家思考一下x.e cos。是不是处?为什么,因为你是不是。
21:00
调这个equals方法是不是X,去掉X是不是一个string,各位。我再问大家,String的equals方法有没有重写?既然string这个类的equals方法重写了,那这个结果是不是就是true?重写了比较内存不是啊,重写了比较的是内容。你往里边说白了,放了一个S1。这个X1实际上就是个ABC,你你你判断xxx是不是也是个ABC,所以你放进去ABC里边包含不包含ABC啊。你好。这边是不是就相当于是放进去一个ABC。对吧,这个I的方法可以看作是什么,放进去了一个ABC。
22:05
是不是,哎,那么这个是不是判断。集合中是否存在ABC吧?能C吗?判断判存在不出来X吗?这个X代表的是不是就是ABC啊,所以这个结果是不是就是true啊?它底层调ES方法了,我主要重点是想说这个事儿,Contains方法a release的这个集合,底层调的这个contains方法,它实际上调的index of index of调index of index of里边掉了o.ES它。所以判断这个集合里边到底包含还是不包含底层,它会掉equals方法,你的X虽然和你的X1是两个不同的对象,但是你X1和X它的ES方法是注。
23:00
你明白吗?因为你是string string的S方法已经重写了,String的equals方法比较的是内容,所以不管你拗了几次,你只要你S1是ABC,我S2X也是ABC,我就认为是相同的,那我放进去S1,他问你包含不包含X,那肯定是包含。所以它底层调的是equals方法。包含吗?来你运行一下,你看它包包含不包含,它包含。包含它底层调的ES方法,你看处吧。是不是这个结果是处?他问你C里包含X吗?包含。对吧?所以这个例子我最主要是想说的是什么呢?是contains方法,是contains方法,是用来判断集合中是否包含某个元素的。方法,那么它在底层是怎么判断集合中是否包含某个元素的呢?
24:03
哎,调用了什么呀,Equals方法进行比对。Equals返回处equals方法返回处就表示包含这个元素。明白吗?
我来说两句