00:00
来,同学们,咱们开始上课啊,我们先来回顾一下我们这个上节课的一个内容,我们上节课呢,就开始讲我们伽va语言当中的一个叫做集合框架,是不是集合这一块的啊,我们把这个集合的一个集成结构图我们再打开。呃,我上节课呢,我在最后的时候,最后的时候说了啊,我让大家去记这个继承结构,我不知道咱们班的同学有几个记住的啊。呃,咱们如果是现场面授的话,这块是可以怎么着呢,可以提问提问的啊,但现在远程这种方式呢,可能提问起来啊,呃,不是很方便啊,不是很方便,所以呢,我就不再提问了,我们在这里呢,就再回顾一下,是这样,首先大家要知道集合这个东西啊是个什么,它是干什么用的。那集合其实就相当于是一个容器啊,就是个容器。各位啊,它就相当于是一个,呃嗯,你去超市购物,我说了啊,你可能拿的是一个什么呀,购物袋是不是这个购物袋就是个容器啊。
01:00
包括你推的那个购物车,你购物车里边放的是不是商品啊。对吧,哎,有没有可能就是说你的购物袋是放在你的购物车里。有可能啊,对吧,哎,所以说容器这个东西是什么都可以放,什么都可以放,只要它放得下,你都可以往里面放。啊呃,这是第一点,第二点是集合或者是容器,在我们Java语言当中啊,它是只能存引用。只能存我们对象的内存地址。它不能存基本数据类型,也不能存Java对象集合,里边存的是一个Java对象的内存地址啊,我这个强调了很多遍。那在Java语言当中啊,我们集合有两大类,一类集合是什么呢?一类集合是以单个方式存储元素的。啊,以为代表。那还有一类呢,是以键值对的方式,K和Y6的方式去存储元素的,K和Y6都是一个引用。那么这个是以谁为谁为代表?以map为代表?
02:00
啊,那么这块呢,这个集合的集成结构图呢,我们需要大家记住什么呢?这个图上有哪些常用的。接口。啊,哪些是接口,哪些是实现类。接口是无法创建对象的。我在这里强调一下,接口是没有办法创建。啊。只有它的实现类才可以去创建对象。啊。啊,这个要注意啊,其实要记得类没几个,Collection这块呢,它有个副接口叫able,表示可接代的。那这个接口当中有一个方法。那我们collection集合呢,调用eer这个方法返回给eer。所以上节课就有同学问了,老师,你这个ER是个方法还是个还是个是个类型名啊,哎,它是既是个方法又是个类型名。对,你调这个ER方法可以返回一个erator对象。拿到这个对象,对象干什么呀,便利呀。是不是,哎,拿到它进行便利。
03:01
啊,便利,那么便历呢,它这个啊,它里边有什么呀,有这么三个方法,什么has next remove remove。嗯。好了,那么接下来再往下的话,我们collection下边呢,有两个这个分支,一个分支是list,一个是set list里边纯元素的特点大家注意是有序可重复。有序指的是存进去的顺序和取出的顺序一样,其实最主要有序说的是它有下标。下边从零开始,以一递增,01234。这就是list集合,就是link list也有,A list也有,VE也有,这些所有的集合里边,它都有下表。都有下标啊,包括这个link link list链表它也有下标。所以它是有顺序的。存进去有顺出来,存进去的顺序和取出的顺序是一样。这就是粒子的即可可重复,就是可以存放重复元素呗,对吧,存一个一再存个一行不行啊,可以没问题。那么S集合它的特点是什么呢?就是无序不可重复。无序指的是什么呀?你存进去这个顺序,取出来就不一定是这个顺序了,就有可能乱了。
04:09
对,这是S它集合的一个特点啊,不可重复,就是存进去个一再存一个一行不行啊不行,存不了重了啊重了。那么我们list这边呢,它的实现类有常用的有这么几个啊,当然除了这个之外还有一些别的。直播不是很常用,你面试的时候不能说啊,List下边只有谁谁谁谁谁,你这个说法是错的。你不能说只有谁谁说,应该说list下边常用的有谁谁谁。啊or呢,它底层是一个数组,Link的list呢,它底层是一个双向链表,VE呢,它底层是数组,那这个不常用的原因是因为什么呀?它这个类当中的方法都是synchronized的,修饰的都是线程安全的,多线程环境下它是安全的。效率比较低,用的比较少,因为现在我们控制线程安全有别的方法。啊,所以这个用的很少了。那么。
05:04
那赛这边呢,它有一个哈希赛的实现类,这个实现类呢,它底层啊,我们看过源代码是不是它是创建那个哈希map。对,你可以从这再看,再看一下。哈西赛。哈呢,这块呢,你往上走一走。你看看他的构造方法,哈希set在创建的时候,它底层哈创建了哈希map。往哈西塞集合里边干什么呀?添加元素我们看一下,实际上是把元素加到map集合的部分了。这个铺的方法是map集合的添加元素的方法。我们上节课呢,说到list集合,Set集合,添加元素是哪个呀?是a Di的方法,是来添加的。但是到了map集合里边之后,它就不是ad了。当map集合里边,它是以put方式添加的。这个方法名叫put,是添加啊添加KY6键值对吗。
06:01
是不是这是map集合,所以你加元素啊,往这个哈set里边加,是把这个元素放到了map集合的K部分,这是K。啊,就用图来表示的话。是什么意思呢?这个就是那个map集合,假如说。啊,这就是那个map集合,KY6KY6KY6KY6啊KY6对它加元素的怎么加呀,它是这样加的。他是。这样价格。K。Value键值对调哪个方法呀?调map集合,它有个方法叫put。Put括号里边跟一个K跟一个value。这个KV键值段对吧,一下就放进去了。啊,再放一个K,再放个YY6接着对。但如果你大家也看见了,这个叫什么哈希什么,有个哈希set吧,哎哈,Set它有个方法叫ADDA,是不是ADDADDA方法在执行的时候。
07:01
它是不是调用了map的put方法,这个参数添加的时候,把这个一加到哪keep。这个Y6部分呢。哎,你看他自己在这了一个object。是不是,哎,咱们先不用管这个Y流是咋回事啊。总之呢,它这个里边它有一个什么呀,叫做爱的。I的方法,这个I的方法加元素是把元素加到map集合K部分。啊,I map put key value。是这样的。行,那么这个了解一下啊,了解一下就是说我们在这个图上说到这个哈赛,它底层实际上哈map,所以说这个当时我们到时候我们讲的话,我们就简单讲一讲,因为我们重点啊讲谁啊。讲那个哈西麦克。因为你哈希赛的底层是哈希map呀,所以你讲map就行了呀,对吧,所以哈希赛和哈希map其实差不多。Hi,是一个特殊的high map。
08:02
是不是,哎,比较特殊,往这个里边加元素就等于加到麦集和K部分了。那么再往右边这边的sortted side呢?这个接口里边存储元素的特点是跟它一样,无序,不可重复。但他唯独。对我们这个接口进行了扩展。扩展了什么呢?它放到这个接口当中的元素啊,它是可排序的。它会按照元素的大小顺序自动排序。升序呀降序呀,是不是哎,按大小顺序排序,我们叫可排序的集合叫solid side,这个接口价有时间类叫吹set。吹赛的这块呢,咱们将来也不怎么学。为什么呀?因为学校学吹map。我们看看这个吹塞。点过去这个吹塞的底层扭了个吹麦吧,看见了吗?是不是这个地方它是不是也有ad方法。Ad方法加元素的时候是不是还是放到了map即可的K部分啊?对吧,所以说大家想一想这个这个这个叫什么,这个吹ET和这个哈set,这个set家族。
09:04
这个赛家族实际上跟我们的这个map家族。它是有关联的。啊,所以将来在学习的时候,我们重点学这个map,当我们把map的原理学懂学通了,那么我们这个set其实也就学通了。啊,因为我们是往set里边放东西的时候,大家会发现实际上底层它都会创对应一个什么呀,Map集合。啊。你往set集合里放,实际上是把元素放到什么地方了呀?哎,放到这个map集合的K部分上。放到K上面。当然大家要注意,Map集合和collection集合没有集成关系,都是独立的。只不过在这个地方site,它的实现借助了谁map集合?赛家族借助了这个map家族,它的它的这个这个这个这个类型。
10:01
但是你要知道,Map和collection是没有关系的,和这里讲的那collection没关系,没有继承关系啊,Map已经是顶级接口了,他没有父亲。Map是顶级接口啊,那么这个map接口下有很多实现类,比如说其中有个哈希map对吧,哈希map其实对应的是谁啊,就是哈。啊就就就就是这个还塞还塞啊是这样。那么我们的哈map底层是什么呀?是哈希表的一个数据结构啊,要知道哈table底层也是一个哈希表的数据结构,只不过呀,我们这个哈table怎么着啊,它是线制安全的啊,效率比较低,用的比较少了。那high table下面有个子类叫properties,这个属性类呢,它呢也是一个map集合一样,它的key和value要求,要求必须是什么呀?是string。啊,字符串。有这样一个特色特点,这个以后我们会用啊。这个会用。在map下有个子接口,各位,这个接口叫STEM。这个s map这个接口呢,它呢存储元素的特点是什么呢?是放在这个sort map k部分的元素,你听杜老师怎么描述啊,是放在sort map k部分的元素,其实就是在说谁。
11:12
Solid set吧,是不是因为solid set就是吹在吹在层往里面放的时候,是不是放的map机的tip分,你看我怎么描述这个这个这个trade map啊,这个trade map底层实际上就是什么呀。它有KY6吧,哎,它的K啊键键。键啊,不是value啊,是K是键,它的键干什么呀?哎,它的键是可以按照我们元素的大小顺序自动排序的。叫做可排序的集合。可排序的集合。对,有道理,Map没有迭代器的这个方法。啊,Map接口是没有一特的接口这个方法的。就是这样,因为没有继承啊,他继承他了呀,但是你map没有继承啊,所以你map没有迭代器。那有同学说了,老师,我们怎么去便利这个map呀?哎,那有办法怎么便利啊同学们。
12:07
怎么便利map呀?哎,我们可以想办法拿到map集合key吧。拿到所有的K,是不是拿到所有的K之后,我问大家是不是就相当于拿到了一个collection?对吧,我们可以遍历K啊,每遍历一次,取出其中一个键。通过key来获取value,到时候我们看看麦即可怎么变啊,现在呢,先不用管它啊,先不用管它。啊,只要你现在把这个继承结构图呢,能掌握就行。啊,这边这个结构图能背会,那边那个图,诶这个家族能背会,那个家族能背会,哪一个底层哪个是接口,哪一个是类,哪个是接口哪个是类,我觉得这个大家一定要去背啊,我在这里没有办法检查,我一一般是要检查一下。啊,实现类实现类实现类接口实现类,每一个类底层什么数据都含义表,含义表这个呀,这是什么?哎,这是二叉树。
13:02
对不对,哎,二塔数,那每一个数,每一个集合底层它都有这个,呃,对应的这个不同的数据结构啊,不同的数据结构。行了吧,那我就简单就回顾到这儿啊,回顾到这儿。那么当然咱们昨天除了说这个之外啊。哎,集合的集成结构图之外,我们是不是把collection接口里面常用的方法就测试了一遍是吧?哎,测试了一遍啊,这个大家也测了吧。我看好几个同学在测。啊,这个我就先关了啊。我再把这个帮助文档打开,找一找Java u这个包u utility。那U这个包下呢?有谁呢?哎,我们找一找,这个叫collection接口,这个接口里边方法我们来回顾一下,ID一看就知道是添加元素吧,Clear呢是清空吧,Contains呢?Contains是判断集合中是否包含这个元素吧。底层调那个方法还记得吗?Contents方法,底层调顶方法,各位来给个互动。
14:02
集合的contents方法,底层会调用对象的调用集合,这个里边对象的什么方法来比较它包含不包含?不要那个。Equals。啊,会掉equals方法。所以呢,我们昨天呢,在说的时候啊,说什么呢,说这个。我们这个集合里边。放的这些元素都得重写,E方法我不知道大家还记不记得这个。啊,Condens方法用来判断集合中是否包含这个元素。你想想你想想啊。是吧,你如果用一个图来表示的话,你画画这个图。来,咱们把这个图画一下。这是个集合。对吧,集合里面是不是放了对象啊啊,你就理解成对象啊,但这个说法不够精确啊,它不能放对象,只能放对象内存地址是吧,你就理解成对象啊对象。对,你这个对象呢,叫张三是不是啊,这个对象叫什么,叫李四啊。
15:02
这是王五啊。六啊。是不是哎六啊,那么我们集合现在啊,它里边已经放了这些元素了。这就是那个集合C,假如说啊,然后接下来呢,在外边儿有一个对象,这个对象叫什么呀,叫张三。或者叫王五吧,叫王五啊。然后呢,我们集合C。C怎么着啊c.contains。谁呀,哎,这个万五。大家注意看啊。把这个王五传过来,这是个对象吗?是不是传到这儿吧,哎,这个对象假如说就叫O对象。O对象啊。就这是一个O。就是说我们这个C这个集合里边是否包含这个O。
16:04
你现在C集合里边放了他,放了他放了他放了它,你包含它吗?来,你拿着这个和这个进行对比吧。是不是你再拿着它,是不是和它对比啊。对吧,你拿着这个是不是和这个对比啊。是这意思,你再拿上这个是不是和这个对比啊。哎,那么他们在对比的时候,他调了什么方法,我说一下掉了equals。你明白什么意思吧,就是说昨上节课我们讲的说一个集合里边放了很多元素,然后这里有一个元素,我们判断这个集合里面是否包含人家这个元素,它怎么做的呢?调的是集合的contains方法,把这个对象传进去了,集合C里边包含O,不拿着这个O和这个equals,拿着这个O和这个equals,拿着这个O和这个S,同学们,哎。
17:02
如果有一个equals方法。返回的结果是出妥了啊,那这个就代表什么意思啊,哎,就代表那这个集合里边有这个元素呗。是不是,哎,那集合里边代表这个元素啊,哎,它是存在的,有这个,你看这个和这个equals怎么着为处啊,这说明这个集合里边包含不包含王五啊,包含王五,所以这里会调谁的ES方法,不是调集合的ES,和集合ES没关系啊,是集合里边这个对象和对象的ES。就这个王五和外边这个对象这个O。它会进行equals。进行equals,那大家都知道,如果equals方法不重写这个对象,Equals如果不重写的话。那么这个时候呢?我们的一定是谁呀,Object那个类的equals方法,那悲剧的是什么呢?是object这个类的equals方法呀。他怎么着啊,他比较的是对象的内存地址对吧,你的内存地址是一,我的内存地址是二。
18:07
对吧,这个显然是不行的,所以他要重写equals方法比较内容。虽然内存地址是两个不同的内存地址,两个对象不同。但是由于你是王五,你我也是王五,问我这个集合里边包含不包含王五啊,包含。是吧,为什么?因为equals方法比较内容,所以我们在这要重写equals。重写E次方法不重写,它用的是双等号,各位啊。它用的是双等号,听听懂了吗?不重写,用的object equals双等号,这个双等号是比较两个对象内存地址的,我们应该比较内容,比较内容明白吧,哎,Equals要重写。那么这个是我们说的contents方法,再往下啊,这个equals就不用研究了,这个equals和我们刚才说的equals没关系,这个equals是是说这个collection集合它的equals方法是不是,哎,咱就呢不用看了啊high后面没关系的,这个方法呢,是用来判断集合里边有几个元,这个元素是不是为是不是为零。
19:03
啊,是否为空。对,这个元素里边如果元一个元素也没有,元素的个数是零的话,那就返回处呗,空呗,是不是?哎,那么再往下这个方法,那就是我们collection这个集合,它所都有的,这个collection集合呢,它继承了负接口,就是在我们这个图上,你可以看到它集成e interable,它一个有一个ter方法。这个特瑞方法呢,实际上是谁的方法呀。嗯。是谁的方法呀?这个这个方法是谁的方法,其实是从负接口里边继承过来。啊,就是ER这个方法啊,好,拿到这个ER这个方法之后呢,咱们这个ER这个方法里边有三个方法,一个叫hasna,表示有没有更多的元素吧,如果有的个有的话,条件为真的话,是不是,哎,那么接下来我们是不是调next的方法,是不是取元素啊,哎,取元素啊,取元素调next,取元素调next,取元素还是next和next定交替先调它,如果为true再调它,先调它,如果为true再调它,先调它是不是如果为true再调它。
20:11
如果为false,就代表没有更多的元素了,就下边没有元素了,那就不能再调这个了,所以是个Y循环啊,我们这块呢,讲了一个Y循环是不是啊,Next的这个方法返回值类型是object,各位啊,有老师E是个什么玩意儿,这是个泛型,大家先不用管泛型,各位啊,这块呢,你只要知道你的next方法取回来是一个object就可以了。啊,好,这是这个。那么再往下呢?Remove方法我上节课也给大家讲了,这个方法是删除集合中的某一个元素,删除的时候掉的也是ES。所以这个remove方法,还有我就是这个remove方法,我可以再演示一下啊,就是这个这个集合里边张三李四王五张六是吧,这个对象内存地址是一,这个内存地址是二。两个内存地两个对象内存地址不一样,我集合C呢,去调什么呀,去调这个remove方法。
21:07
轮步啊方法,那么步方法把O传进去,这个O是谁呢,各位。这个O是谁呢?O就是他。把这个O呢作为参数传进去,对吧,我C这个集合去删这个O。那我删不删张三呢?对吧,他拿着张三和这个王五进行ES,拿着这个对象和这个对象进行ES。Equals force表示这个不闪。那这个李四呢,和这个对象equals对吧,发现equals返回false他就不删,他拿着这个对象叫王五,这个对象也叫王五equals返回处,诶,那这个王五就被删掉了,那这样的话,这个集合里边这个元素就被抹掉了,干掉了就剩三个了。所以说这个remove方法呢,大家也注意它底层啊,也会去调equals方法,你有没有发现我刚才在描述的,拿着张三和这个对象怎么equals,拿着这个和这个equals,拿着这个和这个equals,发现这个和这个相等,那妥了,那这个元素就是要被删除的元素,直接就删掉就完事了,它底层会掉equals方法,所以总之呢,放在集合里面元素是一定要重写equals。
22:07
啊,这是我们昨天也说的比较重要的一个结论啊,就是放在我们集合当中的元素啊。都是要重写equals方法的。啊,要重写E的方法的啊,那么再往下的话,我们这个size是用来获取集合中元素的个数吧,是不是这个size和这个em其实掌握一个就可以了,Em其实它底层就是获取,获取我们元素的个数是不是为零啊,是不是为零啊这个empty,那你这个size呢?其实就是获取,获取元素的个数,其实是一个方法,底层啊底层那么突位是转成数组了,这是转成数组各位啊,就是把一个集合调to为这个方法,就转成数组这种数据结构了啊,返回这个object类型的数组啊,这个方法大家也要有一定的了解啊。那行了各位,那到这儿为止啊,咱们就相当于把我们上节课所讲的东西全部又回顾了一遍。
23:00
啊,又回顾了一遍啊,我不知道这个回顾对大家有没有帮助啊,有没有回想起来?把方法再看一看是不是,哎,我们讲了迭代通用的迭代器的这种方式是不是,你迭代器那个代码是不是狂敲狂练了,对不对,拿迭代器怎么拿,拿到迭代器之后调这个迭代器里边这个方法还是next next的有没有取域对吧?哎,这样。行吧,那就回顾到这儿啊。
我来说两句