00:00
好。那么我这块呢,考一下,大家注意听啊,在这里有一个collection test05,然后接下来我们来测试一下。测试content方法啊,那么这块呢,我假如说我有一个集合collection一个什么呢。New这个的,接下来我把它导进来,把前面这个给它导进来拖拉,这个叫做创建什么呀,集合对象,那么接下来我在这里有一个class,我叫user用户,这个用户呢,他有一个什么呀,哎,用户名。然后接下来呢,我提供一个构造方法,无参,我再提供一个构造方法,有参数的。好了,那么接下来呢,我在这个集合这一块,我创建用户对象啊,创建用户对象user u1等于new一个user,然后接下来我给他传一个名字叫杰克,然后呢,User user2呢,我再new一个user出来,我再往里放一个叫做结克,好了,那么接下来我们在这一块,哎,加入集合,c.I的把U1加进去,c.I的把U2加进去,好。
01:26
那加进,呃,把U1加进去啊,判断集合中是否包含U2,来我们输出c.contains u2。这个结果是true还是false?各位看我这里啊,没有重写equals方法啊,没有重写equals方法啊,没有重写equals方法啊。啊,Contain方法底层会掉equals,听懂了吗?我这没重写,那证明它是不会比较内存地址啊。
02:05
嗯,好好想想。这个位置是不是一个集合创建出来是new,这个user是不是叫杰克呀,放进去了吧。那现在这个地方是不是又拗了一个新的对象?对吧,判断的集合率包含不包含U2啊。没有之前没有重写。一口之。这个结果是false。嗯。你好好捋捋啊,Contains,我问你他是不是会掉这个contains方法。这个是不会,Index index of index index of,会对吧。对象和对象之间比较用ES对不对?好,那我问你集合里边现在放的是一个用户对象对吗?
03:05
是不是一个用户。对吧,好,那我是不是底层会执行U1.1cos u2。而我的user现在他没有重写equals方法,所以我们这个equals方法是不是一定会object类里equals方法?Object这个类大家都很熟悉,我们点过去这个里边的equals方法是不是用双等号比较的内存地址?那我们在这里拗了一个user,又了一个user,那我们拗了两次,是不是两个对象的内存地址啊,那两个对象的内存地址,所以U一点equals u2现在是不是一个false啊。所以这个现在是包含还是不包含啊,不包含。
04:03
False吧,哎,那我问大家,如果我在这重写equals方法呢?重写equals方法,将来调用equals方法的时候,一定是调用,一定是调用这个重写的equals方法,我说的有道理吧。来,那么我们就重写一下out insert,重写我们的一个equals方法。EA。先先删了,不要了啊,生成的equals,这个equals方法的比较原理是什么?这个equals方法的比较原理是什么?只要人名一样,只要姓名一样,就表示同一个用户听懂了吗?
05:06
好,大家看看这个代码看不懂是吧。啊。哎,别生成了,自己写吧,行吧,哎判断一下,如果说什么O要是等于等于什么那。或者说什么。Or instance of?它不是一个user的话,我们直接return一个什么就行了,False。如果说O等于等于this return to就行了,到这儿的话,我们要获取一个什么呀?User的名字吧,强转吧,是不是O转型成user啊?判断一下,如果说user.name.es谁this.name那我认为是不是就一样返回一个true就行了。对吧,哎,或者说直接return return谁呀,Return它呗,这之前咱们接触过的,你看它等于空,或者是它不是一个就返回false呗。
06:07
对吧,这个对象O,如果和this内存地址一样,返回true。到这儿的话,就把O呢强制类型转换,转换成user之后呢调user它的name.equals this.name如果名字一样就表示如果什么呀,如果名字一样表示同一个人。就是不再比较对象的内存地址啦,比较内容了。好,我问大家,虽然你拗了一次又扭了一次,但是都叫杰克,对吗?所以我问你U1是不是就是U2 u2是不是就是U1,你把U1放进去包含不包含U2,当然是包含,也就是说你现在如果重写了ES方法,那么这块它判断集合C是否包含C2的时候啊,是否包含U2的时候,这个结果就是true了,这是重写equals方法之后比较。
07:01
比比较的时候会掉一,比较的时候会比较什么呀?Name。你contains方法,你再点过去,你看看它底层是不是掉的contains,掉的index of index掉的index of index of里边掉的equals,总之你一定会调ES,那么这个就是U1,这个就是U2,那U1和U2的ES方法返回处的情况就代表包含,那你现在U1是杰克,U2也是杰克,你把U1放进去,就相当于把杰克放进去了,你把杰克放进去,他问你在这里问集合里边包含不包含杰克,那当然是包含了。因为你U2也代表杰克呀,现在比较equals重写了呀,它调的是你重写之后的equals方法呀,所以这个时候你放进去U1对吧,那你判断包含U2吗?就是了,你再看看。好,大家看这一次是不是结果跟刚才就不一样,就是true了吧。就是杜老师讲半天想说一个什么问题,各位。
08:01
你给我总结最后一个结论,我不管你这个过程听懂还是没听懂,我希望你最终总结出来一个结论是什么结论,各位。放在集合当中的这个元素。需要重写什么equals方法?就是咱们绕了半天将近讲了快一个小时这个问题了,其实最终我不管你听明白还是没听明白,总之你要记住一句话,放在集合里面的元素要重写equals方法。明白什么意思吗?就是放在集合里面的元素啊。需要重写equals方法,你不重写。它比较的就是对象内存地址,你重写了就比较内容。你没有重写之前,它包含不包含,它不包含,你重写了equals方法之后,对吧,它包含不含包含,因为他认为U1叫杰克,U2也是杰克,U1和U2是同一个,所以你把U1放进去,你说U2在C里边有没有,他会有。
09:10
但如果你没有重写这个方法,那么这个地方肯仍然会掉equals。你重写不重写都没关系,你都会调equals,只不过你不重写,它调equals掉的是object类的equals,如果你重写了,你掉的就是你重写之后的这个S方法,就是我说的是这个ES方法,它将来调这个ES的时候,它一定会调什么呀,你这里重写的这个ES方法,而你这个ES比较的是。你看比较是两个人名。对吧,哎,比较两个人名,所以这个结果就是。所以这个结论啊,这个说了半天,这个结论是什么?就是存放在一个集合中的。Java,对,呃,存放在集合中的类型。一定要重写equals方法。
10:03
存放在集合中的类型一定要重写ECO方法。那大家现在思考一下这个,我现在呢,在这里把集合C调I的方法new一个inte出来,我里边放的是1万。紧接着呢,我再往里边放一个1万。啊嗯,别往里放1万了,假如这块啊这样。我这样写,大家看,X等于它。把X放进去,In t y,你一个in t也是1万,那么接下来我判断C里边包含Y吗?这个结果是true还是false?In t X等于谬一个对象,然后c.I的X new y谬出来判断包含Y吗?这个结果是true还是FOR3?
11:07
是不是包含呀,因为我说了contents是不会掉equals方法。会掉E,我问你X点1Y的结果是true还是false?这个X是不是放进去了。他问你包含集合里包含不包含Y吗?他拿他会拿着集合里边这个X和你这个Y进行比对吗?比对的时候它会掉E口的方法,而你的引提这个类的E有没有重写?Inter类的equals有没有重写,重写了吧,所以现在这个结果是true还是false true吧。啊。是不是,哎,这个结果是true。X6出来放进去包含Y吗?包含。
12:02
为什么?因为X就是YY就是X,虽然扭了两次地址不一样,但是因为它重启了一口放,比较的是内容。比较的是内容啊。这个地方大家有什么不解的地方吗?思考一下。
我来说两句