00:00
那么这个proper过完以后,咱们最后这一章呢,还差一个内容,就是关于collections工具类的使用,前面呢,咱们讲数组的时候呢,说完数组以后呢,讲了一个叫A,对,就是操作数组的一个工具类,那么现在呢,讲包括map讲完以后呢,讲一个collections也是一个工具类,那就意味着它里边的方法啊,基本上都是静态方法了。诶,工具类呢,都具有这样的一个特点,那么collections首先明确一下,它就是来操作我们集合的工具类,但是要注意它能操作的不光是collection,它还包括操作map,所以呢,我们说collections呢,是一个操作set list和map等集合的工具类。啊,这个呢,大家先明确一下,那么既然这个工具类,咱们主要关注的就是它内部呢,提供了哪些功能,哎这呢,我们哎列举出来了一些方法,哎我们对这个方法呢,简单的做一个说明,啊所以呢,这块我去新建一个,不妨呢,我就叫做collections的一个测试,哎首先我们这里边先明确一下这个collections,哎它呢是操作collection和map的工具类,千万不要把这个map给丢了。
01:24
我们看这个方法的时候,你会找到里边呢,其实有操作map的方法啊,所以呢得含着map,这是第一个,第二话呢,我们讲它的常用方法,一会咱们来测,还有一个事就是这个collection啊,啊也有个明题。其实哎,挺无聊的了,大家都能猜出来了是吧,说这个collection,诶collection和这个collections的区别。怎么说呀,找同学说一下啊,Collection和collections的区别。
02:06
诶,戴子阳就这。啊说collection呢,是创建集合的一个接口,Collections呢是个工具类啊,其实没毛病了,就稍微可以再多说两句就行是吧?哎,操作呃,这个是个工具类,是操作这个collection的一个工具类,哎,这个呢,是我们存储这种单列数据的这种一个集合接口啊里边呢,常见的这个呃子接口就类似set是吧?哎,就是稍微多说两句就行啊成这个呢,大家得知道这个区别是什么啊,你可千万不要说这是个复数啊,正好大家这个名词啊,这个复数就坏事了啊,那么我们看一下它这里边的常用的这个方法,常用方法的话呢,我在PPT里边啊罗列出来了一些。
03:00
啊,除了这些之外呢,啊,你还可以看一下API,那还有啊,你在这儿呢,诶collections进来它呢是一个类啊collection是一个接口,嗯,在下边找你看这里边就这些方法。还是挺给力的,方法不少,在这里边你能看到他有操作这个map map的。所以说呢,人家不光操作collection啊,还有这个map行,那么看一篇呢,方法更多,这呢我们就列举出来一些相对大家用的频繁,频率呢稍微高一些的啊呃,这呢,我罗列出来了跟排序操作相关的一些这样的功能啊,这是一波CTRLC。哎,这是一些,然后下边呢,还有这样的一些。嗯,CTRLC,诶这样的一些,诶先来说一下,这里边咱们呢,就是挑着来说一下就行,很多方法呢,大家一看到这个方法名,基本上也能够猜出来它的一个主要的意思。
04:05
成,那这块我们来看一下。嗯,这个呢叫rewards,反转一下list工具类嘛,嗯工具类里边呢,呃这些方法呢,肯定跟你这个list本身里边那个方法那就不太一样了啊呃list的话呢,里边可没有rewards了,你如果呢想把这个呃list中的这元素呢,Rewards你就用它。诶,你说会不会有个rewards方法里边去把那个赛res一下。会有呗,不会吧,为啥呀,他都无序了,你你跟他反转有啥意义呢,他又不是按照这个顺序去便利啊去啥的是吧,没啥意思啊,哎,历史你有序了,我才给你反吧,行啊,然后那下边这个叫S是吧,说这个什么意思呢?可以对我们当前这个例子呢,进行一个随机的排列,就是它可能有一个顺序,但是呢,你这随机一下,这呢,就可能会使得我们每次调离方法呈现出来的效果就不一样了,哎简单看一下。
05:09
这呢是以这个list,那这好几个都是list,那不妨呢,咱们就造一个list得了。造一个这个release。往里边呢,我们添加数据,添加一些,哎,添加一些这个数据,添加这个数据的话呢,这呢,因为涉及到还有这个排序,那不妨咱们就都放同一个类型的得了,第二啊去艾特,我就写一些这个整形的一些数据。好,放来这样一些数据,然后呢,我们看一下刚才这个操作啊,第一个呢叫reverse,呃,首先呢,咱们直接呢去输入一下这个list,然后呢,我们调一下这个叫collections。哎,它呢,哎第二第二做一个reverse,哎把这个例子呢,我们放进去,放进去完以后这个方法本身。
06:10
发本身是个voice的,那就意味着是这个list本身被改了,我们呢再输出一下这个list。好,这呢是原来的顺序,现在是给大家reverse以后的一个顺序啊,这个很好理解啊,这叫reverse,然后呢,下边可以对它进行一个随机化collection点看我们调这个叫。诶,不对吗,SH。好,然后把我们这个例子呢给它扔进去,这呢是做一个随机化处理执行。那这呢是这样子的,那这个零还在这个后边啊,43第一个你再跑一次。
07:00
还是是吧,再跑一次。就变了嘛,诶这呢,就每次给大家随机处理一下。这样子啊,就每次都有变化了,这才叫真正的这个随机啊,跟这个无序可不是一回事,下边呢,是对我们这个list呢进行一个sort。排序排序,你看他就直接把这个list子扔进来了,那这个排序呢,对,其实你能想到的是不是就自然排序了,就要求呢,我们填的这个数据按照它的呃comparable的,它得实现这个comparable接口了啊去排,那你要是没有实现,或者说你想换一种方式S的时候呢,把这个list放到这儿,哎,然后呢,你这个去造一个competitor里边呢,按照你这个list中的那个元素啊,去比较大小啊,谁大谁小,这常叫定制排序啊,这个呢,其实啊一看大家也能看,也能明白啊测试一下。嗯,这生态排序那就调用的是你这个integer里边的啊,那个compare to方法。
08:06
从小到大排OK行,呃,Swap呢叫交换啊,交换我们这个例子中指定索引位置上的两个元素啊,这个我们把它呢也注释一下。啊,交换这个呢叫swap,把list放进去,交换一和二缩引位置上的就是交换它俩,看这呢,这边把它俩呢就交换了一下行,这个是它,然后下边,下边呢我们可以去计算获取一下这个collection当中的最大值,Collection当中的最大值呢,按照指定的这种方式去排列的啊找到最大值这块我就不测了哈,找到最小的啊,指定的这个定制的这种找最小的,这就过了。啊,这就过了啊,这个能理解不能就是所谓的最大呢,就是右边那个最后那个数就是最大的是吧,下边这个呢,叫frequency啊,频率指定的这个集合当中这个元素出现的频率。
09:12
比如说我这个765放了三个。把这个呢注释一下,在这调一下collection点叫frequency,把我们这个例子呢放进去找一下这个765出现了几次。嗯,不妨呢,就叫做这个了啊,一下就他。哎,这不出现了三次,哎,这样啊,你要写个123。哎,那就出现了一次。啊,一次行,这个呢比较简单,嗯,下边有一个叫copy这个方法,大家写的话呢,是可能会出错的,我把这个事儿呢说一下。
10:04
复制行,咱们呢,还以咱们刚才写的这个list子为例吧,CTRLC,诶放到这儿啊,这个呢有点长的,就稍微去一点,这呢是一个list子了,现在呢,我想把这个list子呢给大家再COPY1份,你看这个行参呢也知道,就是我们这个list子呢,应该放到这,这个呢就是复制以后的这个list了,OK,那这块我们写一下啊collections哎,点二我们去调一下,这个叫copy掉copy,然后呢,逗号后边呢写你这个list。啊,那你呢,需要去提供一个list,那我们list desk等于new,一个list这样写了,然后把这个desk list ctrl c ctrl v,啊,这不就A就扔到这儿就行。啊,这么说把src当中的内容复制到death当中,D呢,就是destination目的地啊,这是你这个原原来的这个啊,最初的这个list。
11:06
行,这波我们就放进来了,Copy呢,本身也是个word,因为数据已经到这儿了,诶我们关心的呢,就是此时的这个desk是不是呢,跟我们原来这个list子是一样的,这呢我就输出一下好执行看看对不对。哎,报错了。说那叫index auto exception说south does not fit ins。SSSS呢,就是咱们说的这个。这就是S说它呢,不适合于这个,这个要适合吧。Fit,比如说你买了一双鞋,那个鞋呢,不适合你的脚,这不用的,这个叫fit,鞋小脚大诶进不去了,这个呢,有点类似说你这个SSSS,我这有好几个元素跟这个进不去,这个呢,可能觉得有点莫名其妙啊,不知道怎么回事啊,它是在咱们这一行代码出现的,那你是不是就可以看看这里边啊。
12:06
看了呢,就不想再往下看了,有点长是吧?啊其实呢,不复杂啊,直接呢,抛的就是这个异常,就这异常啊,那你看一下为什么抛,肯定这是出了找到咱们这个嗯,S它的size。就是多长,如果你这个size呢大于d.size这是不是零啊,那显然它大于它,那就抛一场了,那你要想填成功,还不能让他满足这个事儿,就是说白了,你这个death呢,这个长度还不能比它小,这这这怎么整。怎么着,有没有同学可能会想说,那在这块这样这样简单啊。对吗?这样对吗?
13:01
有同学非常正确,嗯,对这要对,那你相当于是不是你这时候我要是打印一下这个点size是几。我说也得说说说啊,这是五个是吧?啊我我错了,我以为这六个呢啊啊五零呗,你这呢是指定的是造底层数组的长度啊,Size指的是你填了几个啊,别把别自己把自己都给骗过去了啊,那我这里边代码这不还是看的是size嘛。所以说你这时候呢,想想通过这呢,指定这个list.size是不靠谱的啊。怎么办好这些同学说,哎,有招是吧,我就带点,我就at是吧?艾的话呢,我随便写都行,关键目的呢,就是我得把这个size给它撑起来是吧,保证这个size呢不能比这个小是吧?啊,写谁无所谓,然后这能成吗?这成倒是没问题,能成,嗯,这是我写了几个,我正好写了五个,多写多写俩写多了。
14:17
写多了还多了,那就还不能整多了,就得整整整这么多是吧,哎,你这五个我也得整五个,我艾特五下,这个是不是有点太悲壮了,想做个复制,然后你还得还得往里边添点数据才行是吧?啊这呢就不能这么着整了啊首先呢,咱们说一下诶目前的这种写法注释一下啊,这是一个哎错误的,或者说我们就要报异常了。哎,报的这异常啊,就是里边的这个事儿。嗯,这个啊,这已经看不到了啊,报异常。把这个问题CTRLC。啊,这样个事情,那为了保证让他不暴力异常呢,就是主要呢,我们希望把你这个death的这个size呢,得给它撑开啊,那怎么撑开呢,其实有一个技巧,前面我们讲过ar.as list。
15:14
哎,我往这里边去称,怎么称,我这里边填几个数,它的size就是几吧,但你这填的话呢,你要又填数,那跟我刚才艾特又差不多了,我这能这样处理。这是我写个list子,点size,诶,那这样呢,是不是要更巧妙一些。看能看懂吧。我那造了一个数组,这个数组的长度呢,就是你S这个list的这个size,那这呢有几个元素呢?是不是就有size个元素啊,只不过每个位置是不是都是no,哎,所以我们转化为这个desk,你要是去打印一下这个desk.size它这个size是不是就等于list.size。
16:04
那每个元素呢,都是no呗。哎这呢,我们去往里填充,哎这呢是一种比较标准的写法。啊,没没标准成是吧,都是no没有付成功,因为呢,我们没有调这个方法呢,还是吧,CTRLC一下。哎,这样调一下啊。这不是通过刚才这个我没调这方法,是不是你也能看到,这不就是五个闹吗?五个闹就是这一行代码做的事。哎,这不就这样吗?这呢是一个复制操作,大家如果需要复制的时候呢,一定要小心啊,不能写成这样了啊,这样就不对了啊。下边这个呢,是一个正确的。行,这个咱们就过了啊,在下边呢,Replace all,把这个list当中所有的这个旧值改成新值,这个我就不错了啊,这就不错了。
17:01
不测了,然后呢,还有什么方法呢,这块呢,我们把这个事得说一下了,嗯,这个事说一下,在咱们这个collections这里边提供了多个sronized叉叉叉的这个方法,这个方法呢,可以将你放到这个参数里边的这个集合返回出来对应的一个线程安全的一个集合了,咱们前边说a real list,对,还有呢,哈希map这两个是不是线程都不安全,那如果呢,真正涉及到需要呢,线程安全了,需要呢,你去考虑这个多线程处理情况下,他们的安全问题,诶我们呢,也不会因为这个呢去选择vector,或者呢叫哈希table,诶咱们呢是想办法把这两个呢转成线程安全的,就会用咱们这里边的方法啊这里边的方法,这是我们要说的这个事情啊,把这个呢。哎,这个我粘过来。
18:03
哎,这么着啊,举个例子,咱们这个叫collections,点它一个呢叫synchronized list这个方法,这个方法呢,你把我们上边这个list,咱们上边list呢是a list,我把它扔进去,然后呢,有一个返回值,这个返回的LIST1,我们说它就是线程安全的返回的LIST1。啊,极为线程安全的一个list。那么你就可以在多个线程当中呢,去操作这个list了,它就是安全的啊,怎么看呢?你其实你看一下啊,点进来啊,这种情况下你有这个对象,比如说我们看它吧,这不就是你刚才那个list吗?扔进去啊,造了一个当前这个的一个对象,造完对象以后大家看啊,我们list呢,常用操作不就是是不是增删改查吧。
19:01
嗯,添加获取set这个index等等,你看它里边是咋做的哈。是不是就是加了个系袋子里边还是用你这个list这个方法,只是呢,给你拿通过代码块包了一下吗?包一下你不就安全了吗?哎,仅此而已。嗯,行,这呢就是线程安全的了。OK是吧,那这呢,咱们关于collection collections呢,这个工具类呢,就呃说完了啊,这个大家呢,也就知道它是一个操作集合,包括collection collection和map的,Map这块呢,我就没有去演示了啊啊没有去演示,如果呢,你需要像这个S的map,我们可以把这个哈希map的扔进去,返回的这个map呢,也是现场安全的啊,是这样的啊诶既可以操作collection,也可以来操作map的这样一个工具类里边有些方法需要的呢,大就过来找就可以了。
我来说两句