00:00
好了,同学们,那咱们接下来再往下干什么呢?再往下的话,我们就得看一看这个link list和vector。对吧,我们好好把这几个里面的这个实现类我们看好好的看一看行吧,哎,我们来看一下啊。那这个release的这块呢,咱们从这个源代码看一下吧,其实方法没什么,各位啊,上面的这个叫做collection方法,我们该讲的是不是讲了。List的接口里边方法是不是该讲也讲了?那么我们讲的这里面的方法,加上这里面的方法,是不是就是我们link list和VE这几个集合里边的方法呀?是不是啊,那行了,咱一个一个看啊,咱们看谁呢?我们看这个的集合。底层源代码我们分析一下。双击shift,输入a list。贴到这个这。点过去。好,我们来看一下这个list。
01:01
这个的这个集合。他呢,继承了这个abstract list,实现了这个list的接口。对不对,那么我们来看它这里有个什么叫初始化容量是十。看见了吧,二的集合初始化容量是十。啊,那么这块呢。咱们在哪写呢?就在这个图上写吧,各位。在图上写啊来双击一下一。二为例,的集合初始化容量是十。来往这一点。换个行吧,是十啊。嗯。来,咱们继续往下看啊,这个的集合底层它是一个数组,大家看见没有,它是个数组,你就看这个就行了,是个object类型的数组。
02:04
这是我们看到的第二个信息啊,来二粒子的集合底层是。数组。它是一个数组。这样的数据结构,各位。啊行,那咱们再接着看。再接着往下啊。源码源码来,这个size应该就是集合中元素的个数吧,是不是?大家看构造方法。Release集合初始化容量。对吧,他说如果初始化容量大于零。对不对,哎,他呢,一个object数组。然后把这个初始化容量传进去。这是不是有参数的构造方法?对吧,哎,这是个有参数的构造方法,看清楚了各位你就说你可以拗一个的集合。
03:01
跟上一个参数。听了吗?也就是说,你的代码实际上是可以这样去写。这啊,Collection这块新建一个class,我们叫a list test01。初始化容量十。默认啊。集合底层是一个数组。啊,构造。你可以这样构造list list1,又一个list。你这个的这个集合,你可以这样做。
04:02
哎,你也可以这样做list list2new一个list。对吧,那这个初始化默认啊,初始化容量是十,这个是指定什么呀,初始化容量。指定出厂容量啊。那雨彤老师,我这个LIST1现在如果调size和我LIST2调size,它数量是多少啊。有的老师这个是十,这个是20呗,来我们看一下是不是这意思。好,大家看都是零对吧?所以size这个方法用来获取的是什么?各位获取的是集合当前中元素的个数。明白吧,哎,所以这个size啊,Size方法就是集合的size方法,是获取当前集合中元素的个数,不是获取集合的容量啊,听清楚了吧?哎,这个size方法是获取当前集合中元素的个数,而不是获取集合的容量。
05:16
这个容量是20,这证明什么呀?数组的长度是20。对吧,哎,数组的长度是20,那这个是数组的长度是十啊。啊,容量和size是两回事啊,两回事,别往一块儿一块儿啊。构造方法对不对,你可以采用这种方式啊,你也可以采用什么呀,哎,这种方式。啊,都没问题啊,指定容量对吧?哎,好了,那接接着看这个代码啊,你可以采用,你看这个初始化容量是不是,哎,This element date element date,我说紫色都是什么呀,都是成员变量,你看这不是这个object吗?然后再往下,你看这边是不是有个this.element date,有个default出出容量的element date点过去你看。
06:12
那个点过去你看。是不是这个东西啊。对吧,哎,这样的一个东西。哎哟。看看啊。帮助文档当中,他现在说的是。找找这个啊。利死他。我看一下各位啊。默认的出装容量,它原代码上写的是这个啊,默认的出装容量是十。是十个啊。
07:04
这个是指定容量吧。这是无参构造,无参构造this element date,然后接下来怎么着?在这里附了这么一个值,这个值这个数组的长度是零啊各位。一个空的数组实例采用默认的size。采用默认的size哦。默认的那应该是这个值,各位啊,它底层可能又做了一些别的操作。默认出账容量就是十,各位啊,我们看一下这个这个这个帮助文档里面有没有有没有有没有说这个事儿啊,这个list下有一个叫做。那现在这个代码改这个风格呀,改的。跟以前不一样了,来啊。呃,看一看他这边有没有这个出装容量。有。
08:04
嗯,应该是I的第一个元素的时候才会初始化,初始化十的这个容量,它现在是这样的,以前不是啊各位以前不是,你看它默认的构造方法是不是构造一个初始化容量为十的一个空列表是吧。是吧,它默认在这儿是有一个十,但是它这是个空数组,它现在采用的是空数组,然后呢,这是构造方法,无参构造,然后在这里呢,给了一个默认的初始化,你看点过去你看。是吧,是个空的,然后呢,我们来看一下啊,看它是不是添加第一个元素的时候,呃,这个这个这个设置为十个十个长度啊,它现在默认是呃,零的是零的,你看点过去这个。是不是零对吧,可以可以看一下,可以看一下啊。嗯,爱的方法。呃,爱的方法,然后加元素是不是?
09:00
是不是这个爱的方法呀?对吧,啊,这个爱的方法当然就是看源代码。哦,这句话最后那句话写了是吧。看一下,再瞅一眼。哦。当第一个元素被添加的时候,它的默认初始化它出装容量就是十了,是不是,哎呀,在这写一下各位啊,默认初装化容量是十。它底层是这样的啊,但是这个的话,你出去面试不一定别的面试官认可,你这么说可能别的面试官不是很认可。啊,因为现在用JDK13的没有。没有公司用13啊,没有用,没有没有用这个的,没有用这么高的。啊,就是默认初始化量是十。呃,就是说底层先创建了一个长度为零的数组,当添加第一个元素的时候。
10:05
初始化容量十,他为什么这么干呢?他这么干啊。是优化了呗,对吧,优化了啊又优化了。但是我觉得这个没啥没啥用,没啥用啊,没啥用,以前就是上来就是屎啊。你们有没有老版本的JDK的?给复制一段代码过来。有没有?安装低版本的JDK的。比八还低啊。比八还低的有没有?八呀,我们来看一下八有没有有没有,现在有没有改动啊。来找一找家吧。我这有八。把那源代码打开。然后把Java,然后浪包打开,然后下边有一个叫啊不是浪包了,这次各位啊,应该是Java YouTube list。
11:14
打开。看一看啊,默认出出量是十哦,这已经是是这个空的了,空的了还有更低的吗。还有更低的吗,各位?有没有比八更低的版本?比八更低的有吗?没有是吧,没有的话就记这个吧,记这个啊,底层先创建一个长度为零的速度,当添加第一个元素的时候,出入量是十。啊,1.6。也是六啊,有D的默认出数流量是十啊,记住就行了。这个有同学老师,我这个需要去记吗?记一下你不记这个,将来可能面试官啊,他会问你啊,你看没看过源代码什么之类的啊,就是release的集合,底层是出发量是十。
12:09
嗯,然后呢,它底层是一个OB数组,然后出入容量是是零的,然后当添加添加第一个第一个元素的时候,它会哎。这个这个这个初始化多少啊,哎,十个十个十个大小的空间啊,十个大小的空间行,那么这是这个代码,来咱们接着看,这里边方法呢,我们可以看一看这个刚才的爱的方法,往里边加元素吗。是不是它加元素,它是怎么加的呢?加的时候它这有个计数器是不是。加了个元素调I的方法吧。爱的方法。然后这个爱的方法呢,呃,它是把元素放到这儿了是不是。那这个地方它有扩容吗?各位,这有一个我们的元素,再往后有一个object类型的数组,有一个element date,然后有个int类型的S。
13:04
是吧,而且这个方法是私有的,他调这个I的方法添加元素了。如果说S要等于等于这个的情况。然后是什么什么意思啊,这个英英语单词是什么意思。什么意思?各位,是成长的意思吗?成长或者增长。我们可以点过去看一下啊。哦。好,大家看这个地方是不是size加一呀。就等于是加加加一,他他之前这个I的方法什么意思,各位。这个I的有的学可能能看懂,有同学看不懂啊,就添加一个元素是不是,然后呢,调I的方法,然后呢,如果是S等于等于什么element date.les这个数组长度的话,它就加一呗。对吧,就等于满了满了增加就这意思。
14:02
增加增加调到哪个方法如。最小容量加一点过去。好了,大家看这个地方有个算法,各位。这地方有个算法。这是什么意思?各位告诉我。右移一位。未运算遇到这个了,各位这是什么意思?看看这个什么意思,叫new capacity什么意思,金融量吗?新容量等于什么?暗卫。右移。右移一位是是多少,各位。这个增长这个容量是多少?嗯。就是这个地方啊,咱们可以测试一下,各位可以测试一下啊,看这个新容量是多少。
15:10
容量除以二。它掉了一个什么呀?A race,呃,Support是不是数组一个一一个什么工具类吧support啊new Les,我们这样,我们先看一下老的版本啊,这个八里边是是怎么做的,是不是这样做的啊。嗯。或者测试也行,测试一下吧,测试一下各位啊,测测试一下。假如现在我们要往这个list集合里面加元素。行吧,加元素测试一下。点I的。我们加上一个元素,两个三个四个五个六个七个八个九个十个,它默认是十嘛,来加一下啊,来23456。
16:02
七。吧。90现在这个例子的集合里边元素啊,它应该是十个就对了啊走。我们重点就研究这个I的方法,看它扩容是扩容多少多少倍啊,我们来看一下它这个I的方法。就这个方法。这个说明有没有指定元素添加到末尾。点过去。有吗?他没说这个是吧,没说这个啊。行,咱们测一下吧,测一下啊,走一个。现在这个结果是多少,是十,那如果说我在这里再加一个元素呢,容量已经满了吧,对吧?哎,再加一个元素。List一点。
17:03
11。加这个元素,我们有没有这样的方法可以获取它容量的?找找吧,各位啊,找一下。看看有没有相关的方法可以获取容量。应该是没有的。他现在这个代码改成这个V的方式了,各位啊,原容量除以二向右移移位。比如说现在我有1000。124,这是四是吧,这是不是二进制啊,转换成十进制。是多少,各位看一下吧,别躲这个东西了啊来,那这样的话右移一位是多少啊。
18:06
010是不是。幺二是吧,是不是。这个十进制就是。100右一一位。010。是不是12345678右移一位,应该是12345678来,这是一吧。一嘛,右一一位原先这是四呗,右一一位变成什么呀二吧。对不对,这结果其实就相当于是四除以什么二。原容量除以二二的N次方吧。
19:01
来呢,看一下这个数,各位啊,算一下这个数掉爱的方法。这个爱的方法a release。找到啊。看看这个数。这是多少?原容量来看看啊,看看代码吧,咱别躲这个东西了,因为这有一个未运算啊,拿过来。增长1.5倍,应该是。看一下这个参数。他说这个地方有一个工具,有个new Le new Le表示什么意思?新的长度,新的长度就是这个值呗,对吧,这个值是什么呀?有一个老的容量,然后有一个最小容量减去老的容量。
20:04
最后有一个老的容量右移一位。啊,那就直接看这就行了,不用看别的了,各位。这个是最小增长值呗,你看这不注注释吗?最小扩容增长值,然后这个是什么呀,这是增长值呗。对不对,增长值应该是O的向右移。那就相当于是1.5倍了,各位。1.5倍啊。原先是四。对吧,哎,原先是四,现在增长多少啊二嘛,增长之后是六。增长了。增长之后是之后的容量啊,是之前容量的1.5倍。
21:10
啊,1.5倍,各位。这个能不能加一个断点测一下。在断点,但是现在第八个咱们还没讲是吧。Deb还没讲各位啊,那咱先这样吧,嗯,咱们得整体的先把debug讲了之后,咱们才再去再去加这个加断点啊加断点,那这会咱们先把这个说一下,是1.5倍,各位啊,现在就原先是四,现在增长了二吗。向右移动移位啊,移位之后呢,是四除呃,四。除以二对是二,呃,是这样的啊,增长的。原先是四嘛,现在增长二,增长之后是六嘛,六是四的1.5倍呗。啊,1.5倍。
我来说两句