00:00
同学们早上好啊,今天我们来继续聊a release和link list的区别啊,那今天我们会有更严谨准确的解读,让你在面试中呢能更加脱颖而出,一起来看看hello喽,同学们大家好啊,今天的话我们来继续谈这道题,那么在上一次呢,我们聊了就是一个标准答案的说法啊,那今天的话呢,我们继续来聊一个更细节的说法,来跟着我看一下啊呃,首先的话我们来看一下瑞list这块的一个细节的分析,那首先的话呢,其实在上面的话,他们会说到什么,说我们这个插入也是说增加慢对吧?啊,那么是因为什么?是因为考虑到数据要做迁移,那实际上这里面的话有个小细节,如果说你的业务需求是每次都加到末尾的,并不是说每次我都需要给它加到中间的位置,那其实来说这个时候啊,并不需要做特别处理啊,除非是空间不够了啊,我需要扩容啊,但是如果不需要扩容的话呢,这个操作其实并没那么复杂,我们来看一下,大家可以跟着我来看一眼,我们在这里面的话呢,来敲点代码看一眼效果啊好,大家跟着我来看一下,假设我们写一个array list啊。
01:00
看一眼啊。A list好,在此处的话呢,我们给大家写一下泛型,然后我们写一下这个list,然后等于new a list OK,注意看这个时候,比如说在这里面的话,这个list啊,我做一个增加ADD,然后加一个内容啊,加个内容,比如说A啊好,我们来看下效果啊。来,大家跟着我来看一眼,这个源码,点进来我们来看一下,大家可以看到啊,扯出来这里面你看啊,这第一块东西呢,实际上来说诶,我放大一些啊,放大一些大家注意看啊,第一块实际上来说它是做这个内存空间的一个,就是一个判断,看我是否需要去做一些啊扩容,然后如果说不需要扩容的话,你注意看,你看实际上来说干嘛呢?我只是很简单为这个数主以这个size子啊,就记录他到哪了,诶,然后直接给这个下标赋值而已,所以在这个情况下,他根本就不需要去做什么迁移的情况,大家理解这意思吧,OK,好,所以这个时候的话呢,相比来说还是比较简单的啊OK,这个数组的复值而已啊好,这一块大家注意啊,就是说如果增加了末尾,实际上来说呢,假设不需要扩容,那是比较轻松的啊OK,好,那么第二个关于到扩容这里面的小细节,我们来看一下啊,数组的话呢,默认的初始容量多大呢?默认初始仍然是十,怎么看呢?大家跟着来看一下啊,这个时候的话呢,我们来看这源码点进来好,我们可以看到啊,此处这里面的话呢,它会有一个elim。
02:19
T,哎,这就刚刚那个数组了是吧?然后的话,大家也看到这边的话有个东西叫default def default达么呢给了空,诶那么给了空的话,为什么会有这个十这个说法呢?OK,好,所以的话呢,接下来咱们这边看到是没有这个十这个东西的是不是?哎,没有错啊,那接下来注意咱们继续看啊,继续看来看一眼这边的话莫是看不到十这个说法了,那下面的话呢,跟着我来看下一步轴啊轴这里面的话,我们来看这个地方点过来啊,你要看到这里面的话呢,它稍微做一个判断,第一次做个判断,他说这个东西如果是一个空的,那会干嘛呢?它会给它求一个最小的容量,看到没有容量啊,然后大家家以看到这里面啊,这里面会有个东西叫默认的一个容量叫十,看到吗?哎,十,所以在这里面的话,这个地方就会有个结果出来,这个东西就是一个十的结果啊,OK,能看懂意思吧,啊,因为这个结果的话呢,默认你现在传进来的话,肯定是什么,可以传给他一个赛点一嘛,那目前没有空间嘛,没有空间的话呢,默认就是,呃,我们这个十肯定比较大,所以默认是十,我们这样可以给他打断点看一眼啊,断点来看一下效果。
03:19
啊断点断点,哎,这样更好一点,对吧?啊看断点调试,来大家看一眼debug走起啊走起。好,大家可以跟我进来看一下啊,我们看这里面我们再往里走啊,好,大家看再往下走啊,你看到然后呢,这个时候的话呢,你看这个东西是一嘛,那这个东西十,那肯定结果就是什么,就是十,所以大家看到这个结果就是十,能看懂意思吧,好OK啊,这是这一块啊这一块。好了啊。所以我们把这个关掉啊关掉。好,所以这里我们有得到这么一个结论啊,这么一个结论,那么当我们这个容量不够的话,怎么进行扩容呢?所以这个时候大家可以去观察这里面的细节什么呢?它做扩容是这样的,他用的是一个位运算,因为我们知道位运算的效率会更高一些,所以大家看他是往那往右的方向去移动移位啊,移动移位OK,好,所以这个倒是注意啊,它这个时候是在原来的基础之上去加上这么一个东西,加啊,所以相当往右移动移位的话,相是什么?相当是除以二,所以相是0.5嘛,那我自身加上0.5是不是就是1.5倍啊,明白这意思不OK,好,然后最后的话呢,再将这个东西做一个复制啊,数值的复制,所以的话呢,如果是加到末尾,那正常情况下是不需要扩容,也不需要做其他额外处理,效率其实还蛮好的啊,但是如果需要扩容的话呢,就经过我们下面说的一系列东西,OK啊,这是第一个啊,小细节的一个严谨性的说明啊。
04:41
好,那咱们接着再往下来看一下啊,那么如果是删除呢,道理是一样,删除的话呢,如果是删除末尾,那也不需要迁移,那删除其他位置呢,才需要迁移,OK修改,那注意看啊,查找是一样的,注意这里有个小地方,在最开始的时候呢,这边说到查找快,OK注意啊,这个东西其实来说呢,它是有一个前提的,是不要插的快呢,是定位具体某个数组位置,比如说第几个第几个为快,但是假如呢,假如什么呢?假如我现在在这个数组里面,我存了很多的元素,很多元素,那我想干嘛?我想去找其中某一个东西,比如说我说这里面的话呢,有没有这个张三的,那注意我不说第几个,我要找有没有张三的,以内容来匹配,那这个时候其实就算他是宿主也没办法,他也得挨个去比较,他不能像这个什么,像这个链就是链表是一样,链表就是不能像什么,不能像是我们之前说因为第几个来可计算,它找的是内容,所以注意来看一下啊。
05:41
指处啊,在这里面注意啊,这个地方啊,他要查找的话,或说修改的话,查找啊,他都得干嘛呢?如果是什么是一个定位啊第几个那很方便,如果是根据内容,那么依然需要便利,所以这个时候效率也没有快,所以简单来说,说什么呢?这个所谓的快慢啊,其实第一个地点就是说什么这个查找快是定位到第几个快,但是根据内容查找定位没有快,OK也是要变历的。
06:09
然后呢,删除插入这个东西,如果是在末尾,那么其实如果你的业务需求在末尾,那问题不大啊,其实效率不不低,OK,效率不低,懂这意思吧,所以我们呢,这个东西的话,为什么说不严谨呢?是因为我们在经过这同分析之后,你要知道这个答案是不是很严谨的啊好。
我来说两句