你确定 LinkedList 在新增/删除元素时,效率比 ArrayList 高?(上)

简介: 在面试的时候都会被问到集合相关的问题,比如:你能讲讲 ArrayList 和 LinkedList 的区别吗?那么我相信你肯定能够答上来:ArrayList 是基于数组实现的, LinkedList 是基于链表实现的接下来面试官就会连环问了,那你能讲讲,它们都用在什么场景下吗?阿粉知道这种程度肯定难不倒咱们读者的:因为 ArrayList 是基于数组实现的,所以在遍历的时候, ArrayList 的效率是要比 LinkedList 高的, LinkedList 是基于链表实现的,所以在进行新增/删除元素的时候, LinkedList 的效率是要比 ArrayList 高的面试官

在面试的时候都会被问到集合相关的问题,比如:你能讲讲 ArrayList 和 LinkedList 的区别吗?

那么我相信你肯定能够答上来:ArrayList 是基于数组实现的, LinkedList 是基于链表实现的

接下来面试官就会连环问了,那你能讲讲,它们都用在什么场景下吗?

阿粉知道这种程度肯定难不倒咱们读者的:因为 ArrayList 是基于数组实现的,所以在遍历的时候, ArrayList 的效率是要比 LinkedList 高的, LinkedList 是基于链表实现的,所以在进行新增/删除元素的时候, LinkedList 的效率是要比 ArrayList 高的

面试官:哦哦,好的,我大概了解了,我这边没有什么想问的了,您回去等消息可以吗

21.jpg


???发生了什么?

哈哈,上面模拟了一个面试场景,是想引出来这篇文章的主题:LinkedList 在新增/删除元素时,效率比 ArrayList 高,这是真的吗?

我相信你也知道套路,一般这么一问,那肯定就不是真的了

放一张图片,这是经过我测试之后的真实结果

22.jpg

因为微信不能放外链的缘故,可以在公众号后台发送 “20200821” 获取测试代码

ArrayList 与 LinkedList 新增元素比较

从图中可以看出来, LinkedList 在新增元素时,它的效率不一定比 ArrayList 高,这是要分情况的

如果是从集合头部位置新增元素的话,那确实是 LinkedList 的效率要比 ArrayList 高

但是如果是从集合中间位置或者是尾部位置新增元素, ArrayList 效率反而要比 LinkedList 效率要高

Excuse me ?竟然和我以前学的不一样?阿粉我学的浅,你别骗我

23.jpg

哈哈哈,为什么会这样呢

这是因为 ArrayList 是基于数组实现的嘛,而数组是一块连续的内存空间,所以在添加元素到数组头部时,需要对头部后面的数据进行复制重排,所以效率是蛮低的

但是 LinkedList 是基于链表实现的,在添加元素的时候,首先会通过循环查找到添加元素的位置,如果要添加的位置处于 List 前半段,那就从前向后找;如果位置在后半段,那就从后往前找,所以 LinkedList 添加元素到头部是非常高效的(小声 BB ,这我知道

哦,这你知道?看来基础蛮不错的嘛~

0.gif

所以当 ArrayList 在添加元素到数组中间时,有一部分数据需要复制重排,效率就不是很高,那为啥 LinkedList 比它还要低呢?这是因为 LinkedList 把元素添加到中间位置的时候,需要在添加之前先遍历查找,这个查找的时间比较耗时

添加元素到尾部操作中, ArrayList 的效率要比 LinkedList 的还要高,这是为啥嘞

因为 ArrayList 在添加的时候不需要什么操作,直接插入就好了,所以效率蛮高的

但是 LinkedList 就不一样了,对于 LinkedList 来说,也不需要查找啥的,直接插入就可以了,但是需要 new 对象,还有变换指针指向对象呀,这些过程耗时加起来可就比 ArrayList 长了

它是有前提的,那就是 ArrayList 初始化容量是足够的情况下,才有上述的特点,如果 ArrayList 涉及到动态扩容,那它的效率肯定会降低

ArrayList 与 LinkedList 删除元素比较

删除元素和新增元素的原理是一样的,所以删除元素的操作和新增元素的操作耗时也是很相近

这里就不再赘述

ArrayList 与 LinkedList 遍历元素比较

相关文章
|
安全
ArrayList 和 LinkedList 的区别【重要】
ArrayList 和 LinkedList 的区别【重要】
58 0
|
5月前
|
存储 安全
ArrayList 和 LinkedList 的区别
ArrayList 和 LinkedList 的区别
|
5月前
|
存储
Arrylist 与 Linkedlist 的区别
Arrylist 与 Linkedlist 的区别
47 1
|
12月前
|
存储 安全 Java
一.list集合的特点与linkedlist特性的论证
一.list集合的特点与linkedlist特性的论证
59 0
|
Java
ArrayList与LinkedList的遍历删除元素方法
ArrayList与LinkedList的遍历删除元素方法
272 0
|
Java
ArrayList与LinkedList遍历方式对比及List遍历技巧
ArrayList与LinkedList遍历方式对比及List遍历技巧
77 0
ArrayList与LinkedList移除指定元素对比(源码分析)
ArrayList与LinkedList移除指定元素对比(源码分析)
44 0
|
安全
集合不安全之 ArrayList及其三种解决方案【CopyOnWriteArrayList 、synchronizedList、Vector 】
集合不安全之 ArrayList及其三种解决方案【CopyOnWriteArrayList 、synchronizedList、Vector 】
192 1
集合不安全之 ArrayList及其三种解决方案【CopyOnWriteArrayList 、synchronizedList、Vector 】
|
安全 Java 容器
如何在遍历的同时删除ArrayList 中的元素
如何在遍历的同时删除ArrayList 中的元素
402 0
ArrayList和LinkedList的区别
ArrayList和LinkedList的区别
156 0