ArrayList和LinkedList的深层次理解

最近看到有人在论坛上测试LinkedList和ArrayList的速度问题,它得出的结论是ArrayList比LinkedList增删快,后来对其进行了解释,在这里发篇博客,从细讲解两者区别,以及什么情况下LinkedList比ArrayList增删快是成立的.

首先说LinkedList,Linked是什么?链表!那何为链表呢?就相当于一辆火车,有若干节车厢,每节车厢用"链子"连接起来,这就是链表.而LinkedList是基于双向链表实现的,何为双向链表?就是一节车厢,我知道这节车厢的上一节车厢,和这节车厢的下一节车厢,就是双向链表结构.而连接车厢的"链子"在java中用什么来代替了呢?引用!

下面就说为什么理论上LinkedList增删快,查询慢!前面说了,一辆火车有火车头,和车厢,火车头就相当于链表的根节点(root),车厢就相当于普通节点(node),因为每一节车厢只知道它的上一个节点(前驱(pre))和下一个节点(后继(next)),所以如果我们想要找到某一节车厢,只能从根节点一节一节往下找,可以想象一下,假如有10万节车厢,得找多长时间?一个按1毫秒来算,需要100秒,(当然,java比这个速度快多了),所以它的查询效率就很低,数据量越大,效率越低!

再说它为什么理论上增删快!假如现在,一辆火车(a-b-c-d-e-f-g),假如要c车厢坏了,需要去掉,那么我们怎么办呢?是不是直接让c的上一个节点b的下一个节点指向c的下一个节点d的上一个节点(概况说:就是目标节点的上一个节点指向目标节点的下一个节点),假如:现在火车要加一个"贵宾仓(h)",并且h要加载b的后面,是不是只需要目标节点的上一个节点指向b,让目标节点的下一个节点指向c,就可以了?所以,在理论上LinkedList增删快.

下面说ArrayList,Array是什么?数组!那何为数组呢?是不是就相当于装了一类"物品"的"箱子"?这样说了,那这个箱子大小是不是固定的呢?这就是数组大小一旦确定无法修改!你去集市上买了个箱子,发现箱子大了你能让这个箱子变小么?谁能变小让我看看啊!箱子我买来了,假如能放10个苹果,我现在只有1个苹果,可以放么?当然可以,有两个可以放么?那如果有20个呢?显然20个就放不下了,那怎么办呢?无奈,只好再去买个大点的箱子,为什么呢?因为,原来的箱子太小了吧!所以这时候,我跑到集市上买了个能装50个苹果的箱子,买来箱子就好了么?当然没完成吧!你的苹果还在原来的箱子里,你还没有移出到新箱子吧!所以,我又得吧苹果从"旧"箱子中移出到"新"箱子,至此才算结束吧!这就是ArrayList的扩容,和数据的拷贝!假如啊:假如,有这样一种情况,我现在呢(abcdefg)这7个苹果已经放在箱子里了,我现在呢,想再放一个苹果,放到哪呢?放到a的后面,是不是我要先把a上面的苹果从箱子中拿出来,然后再把新的苹果放到a的后面,再把原来的苹果放进去?这在java中是怎么做的呢,是不是自a之后的每一位元素的下标都要+1了?(当然不考虑扩容问题),再假如:我现在要吃b这个苹果,我把他拿出来了,是不是b之后的每一个苹果都会移动一位?在java中就是元素索引-1.这就是为什么理论上ArrayList增删比较慢!

再说ArrayList为什么查询比较快,我们一般往箱子里面放东西的时候是不是都是按照顺序放的?再做另外一个比方吧,比如档案室,档案是不是按照一定顺序进行进行排档,要不要找个谁是不是很麻烦?所以ArrayList他就是一个有规律的箱子,所以他理论上查询比较快!

前面说了原理,都是理论上的,假如我现在有一个情况,就是我的元素就是一个接一个往里面放,删除的时候,就是一个接一个删,(按顺序),这时候就会发现貌似理论上的结论是错的,其实不是错的,而是你照顺序的时候,根本就不用考虑在谁睡谁的前面,谁谁谁的后面,所以ArrayList明显比LinkedList快!前面已经说了,是在添加在某个元素的前面,删除某个元素,这个元素是随机的,所以从整体上来说LinkedList的增删比较快,ArrayList的查询比较快,但是不排除特殊情况,

因此,我们数据库的操作一般都是用ArrayList而不是用LinkedList,这就是原因所在,另外,如果知道查询的实际大小,可以直接指定数组的大小!可以有效的避免数组的扩容问题,可以更快的提高效率

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值