00:00
现在其实也测不出来,怎么能测出来输出这个值。除了第八个之外。但现在你再去输出它的值,就是这个肯定是11这个没跑。是一个元素是吧,它的容量你现在看不出来。嗯。行这块啊,注意release集合的扩容。是容量的。1.5倍啊,1.5倍,那注意啊,List集合底层是数组啊,怎么优化。就是尽可能少的扩容。尽可能少的扩容啊,因为数组扩容效率比较低,建议在使用A。
01:10
集合的时候。预估计。元素的个数,给定一个初始化容量,各位啊,给定一个初始化容量。啊,这是这个这个这个这个东西啊,要注意,因为它底层是一个数组啊。对吧,哎,初始化容量是十,各位啊,第二个呢,就是关于这个底层是一个object数组,第三个是什么呢?就是说扩容。1.5倍。建议啊,建议给定一个预估计的初始化容量。减少数组的扩容。
02:01
次数啊,这是。集合比较重要的优化策略。啊,因为那是数组嘛,是吧,哎,数组。嗯。这个方法跟的话,你是这样跟啊,在整个这个尔为例的这个类当中,然后你CTRL按一个F12吧,啊按F12之后,你再找一下那个I的方法,I的I的添加元素,添加元素的时候调的是I的方法呗,反正有些东西你能看懂,有东西可能看不太懂啊,添加的时候它这个地方你看有个grow,这个就有点像啊,那如果说这个S要等于等于它的话,就代表满了呗,满的话就增加,那增加的话呢,在这就grow呗。Grow的话,那就继续往下调就行了,对吧,它调这个方法,那调这个方法的话,你看呢,看到这个地方有个什么叫old capacity叫老容量呗。
03:05
对吧,容量等于这个。我们这个叫做element date点就像这个数组的一个长度是吧?数组的长度不是size啊。老容量假如是十十大于零的情况下,对吧,哎,十大于零,那这这这没问题啊,对吧,那新的容量等于什么呀,它又掉了这个方法。是不是啊,又调了一个support这样的一个工具类,应该是一个类名去调的方法,静态方法嘛,把老容量传进去了。是不是啊,这应该是一个什么呀,最小的一个增长值。然后这一个增长值。这个增长值是未运算了。老容量,假如说是十。向右移动,移动一位。十是1248。袁容量。
04:00
十幺二四八是不是,那应该是零幺是不是零幺吧。向右移动一位101。124。是不是,那应该是。这个没有吧。五吧。是我。哎,没没声音了吗。哎,不知道在说啥是不是。什么意思?啊,有声音是吧,来这个这个容量啊,它这边有个old capacity向右移动移位这个。这主要是没讲对这个我可以说一下吧,各位说一下啊,这个标示二二二进制右移,就这个符号啊。二进制右移。
05:00
右移,如果写个一就代表右移,移位咱别别躲了,就说吧。不知道未运算是吧,没事,咱咱看看未运算行不行啊,十右移一位是多少。这个这个符号是右移,右移。未运算右移,就是你直接操作二进制的。就是未运算符。
06:01
这个为什么是五啊,各位。躲来躲去是吧,这个东西其实这是未运算啊。这个地方这是什么呀,叫做右移。二进制。有一位。就是这样写啊。二进制又一两位。右移一位其实就是除以二。你好好想想,十到二进制位是多少?这个运算符我们第一次接触啊,嗯,我就在这里说一下行吧,十到二进制位是12341010,对不对,没没毛病吧,零不,这是1248嘛。
07:10
对不对,那十进制。就十的二进制。有。一一位是多少,把这个值啊,右移一位,就一放到这。就往右移动一位。往右移动移位啊,这个位置就补零,这个位置删掉吧。对吧,哎,十的二进制右移一位,就是它那124嘛,这个其实就是十嘛,这个是不是就是。五啊。
08:03
哎,那我问大家问题,如果是这样呢。这个是什么意思?二进制位左移。一位吧,是不是二进位左移一位。来,走一个。那为什么是20啊?是的,二级位是这个吧。对吧,十的二进制。左一。左移一位左一啊。这个是不是没了。家了。
09:04
12486吗。是吧,啊16啊。那这个就是四,这个16,这是多少啊,20啊。对吧,哎,左移的时候右补零。左移右侧补灵。对,就这意思啊。十的二进制位是这个。你你得先知道这个二进制啊。他以前这个不是这些东西啊来。嗯,比如说我叫1010是不是1234是吧,1248吗。是不是哎,16吧,是不是32呀,64吧,128吧。
10:06
对不对,哎。这个啊。那如果是。我们现在的这个一有这个有那一这边是二啊,二加八不是十吗。左移移位就相当于是000这个左移了呀,这就到一这了。是不是那后边还是零啊,这个还是一啊。对吧,这是不是零啊。对不对,哎。1010,那1010呗,右侧补零啊,左一右侧补零啊,那这个数就相当于是上面这个干啥。哎。上面这个二进之位啊,左移移位就是这个德行。
11:04
啊。就这样子啊。1244啊。86啊。四和16不是20吗。左移一位,那你看这一块它的源代码这怎么写的。Old。这是什么意思?打开看一下。天哪。
12:07
优先增长。就还是增长值啊,增长多少。对吧,这是最小增长。优先增长。他原先是十啊。右移一位增长多少啊。增长五。增长是原的1.5倍。没错吧?是吗?右移一位吗?如果这个是有一位。你是理解了,别的同学没理解。这个是十。有一位。
13:00
就相当于是0000。零啊,右移一。零一。是不是,哎,就成这样了。那移成这样是1248嘛,对不对,那这个一加上这个四不就是五吗。对吧,哎,右移一位变成五了。明白吧,增长五你原先十。最后增长五是15,那15是原先那个十的1.5倍吧。增长我们用词要精准一些啊,叫增长到。明白这一这个单词应该叫增长到,就是说A集合的扩容是原容量的1.5倍啊,就是增长到。
14:02
原容量的1.5倍,Release集合底层数组优化这块提了一下啊,行,咱们就说这么多吧,各位啊,这块的东西,呃,你将来在面试的时候,如果把这个继承结构图给它说出来了,然后呢,你能够把维的集合底层的呢,它的一个初始化容量使你能说上来,然后它的扩容倍数是原容量的1.5倍。叫扩容道。袁容量。的1.5倍啊能说出来。对吧,哎,我觉得就可以了,就可以了啊,另外这块呢,数组的优点,我们再回顾一下各位数组的优点。是检索效率比较高是不是?那数组的缺点是什么?随机增删元素效率比较低。
15:02
对吧,来,但是你要注意啊,但是需要注意的是。数组,向数组末尾添加元素,效率还是很高的。向数组末尾添加元素效率还是很很高的,各位啊,来,我写两遍,我在这再写一下。数组优点是检索效率比较高,是不是来数组缺点呢?随机增删元素效率比较低,第七点要注意啊,数组向数组末尾。添加元素效率很高啊,不受影响。
16:01
不受影响啊,像数组末尾添加元素效率很高,不受影响。呃,那么面试官经常会问你一个问题,各位啊,面试官经常问的一个问题啊,经常问的一个问题是什么?就是这么多的集合中,你用哪个最多。这个答案是啊。集合啊,因为我们大部分情况下。检索这个比较多,另外大部分情况我们都是往尔集合末尾添加元素,不会一般不会说往那个尔集合中间插入元素,所以它的增加以及它的检索效率都很高,所以用的比较多一些。明白吧,啊,你答尔维利集合啊,因为什么呀?因为往什么呀,往AA往数组末尾添加元素啊,效率不受影响。
17:06
啊,不受影响,另外啊,我们检索。或者叫查询。查找某个元素时。插找某个元素的操作啊,比较多,就他问你啊,这个这个集合的集成结构当中哪个用的最多,你就list就行了,不用说别的啊,不说这个的。因为我们一般加元素是往末尾加。啊,然后呢,我们查找那肯定它是最快,因为呃,List集合它底层release的这个集合,它底层是一个数组啊。是不是它既然是数组,那么数组它有。为什么减阻效率高啊?每一个元素什么占用空间大小相同吧,内存地址是连续的对不对?哎,知道什么呀,首元素内存地址。
18:01
啊嗯,然后知道什么下标对不对,哎,通过数学表达式计算出元素的什么,哎,内存地址,所以检索效率最高啊最高。这个之前我们也也提过。是不是,哎提过就是数组这块它。存储元素这样存对不对?哎,这样的空间上是什么?内存地址是连续的,你只要知道这个它的内存地址。比如说0X11,这是幺二啊,这就是幺三啊,这是幺四啊,这是幺五吧,哎,内存地址,那这里边存了个100,存了200,咱们不用管管别的对吧,二十三十存了个40,存了个50进去,但它的下边是零啊,下边是一啊,下边是二,下边是三,下边是四啊。对不对,你现在知道第一个元素内存地址,你每个元素所占的空间大小又一样,空间大小又一样,对吧?哎,你知道这个地址,那你通过一个这个下标这个偏移量,比如四减去零等于四。
19:07
中间差四个格对吧,那你这个时候你能不能算出来我们这个位置的内存地址啊,算出来这个内存地址,我们直接通过内存地址定位啊,对不对?哎,所以说它的一个检索效率比较高,一般情况下我们也是加元素是往末尾加的。一般都是往的这个集合末尾添加元素的。只不过有一个扩容的问题,就只有只有一个扩容的问题会拖慢它的效率啊,会拖慢它的效率,我们一般说把这个尔粒子一个中间一个元素删掉,或者是往中间加个元素,这种操作很少。很少,所以说我们的a release使用的是最多的。啊,最多这个答案就是这样说就行,各位啊,面试官可能会问你的,因为问你集合这一块,那一般情况概率比较高一些啊,概率比较高一些,那你怎么答,哪个集合用的多,你告诉他尔丽集合用的最多。对吧,为什么因为这个呢?哎,它的增加的效率以及它的查询的效率都很快,增加的效率快是因为往数组末尾添加元素啊,末尾添加元素它查询效率高,你就把这个原理给他解释解释清了数组的缺点对吧,随机增删元元素效率比较低,另外。
20:14
另外啊,数组无法存储大数据量,大数据量这个之前我们也说过,因为很难找到一块连续的大的内存空间,很难找到一块非常巨大的连续的内存空间就是很难找到啊。
我来说两句