ArrayList和LinkedList区别?看完秒懂~

Posted 程序员十一郎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList和LinkedList区别?看完秒懂~相关的知识,希望对你有一定的参考价值。

工作中,大家是不是经常分不清楚,什么时候用ArrayList,什么时候用LinkedList?

所以我们应该弄清楚ArrayList和LinkedList之间的区别,然后才知道工作中该如何选型。

一、ArrayList和LinkedList查询之间的区别

首先,从名字就可以看出,ArrayList和LinkedList的区别,ArrayList是基于数组的,LinkedList是基于链表的。

从这一点,我们可以推理出来,ArrayList适合查询,LinkedList适合插入,但是这只是一个广泛的结论,我们应该了解的更细致一点。

比如,对于ArrayList,它真正的优点是按下标查询元素,相比于LinkedList,LinkedList也可以按下标查询元素,但是LinkedList需要对底层链表进行遍历,才能找到指定下标的元素,而ArrayList不用,所以这是ArrayList的优点。

但是,如果我们讨论的是获取第一个元素,或最后一个元素,ArrayList和LinkedList在性能上是没有区别的,因为LinkedList中有两个属性分别记录了当前链表中的头结点和尾结点,并不需要遍历链表。

以上,是对于ArrayList和LinkedList在查询方面的区别。

二、ArrayList和LinkedList插入之间的区别

我们再来研究一下在插入方面的区别:

ArrayList可以插入到指定下标位置,或者数组末尾,这种插入普通情况下是很快的,但是如果某次插入操作触发了扩容,那么本次插入就增加了额外的扩容成本。

对于LinkedList,如果是插在链表的头部或者是尾部都是很快的,因为LinkedList中有单独的属性记录的链表的头结点和尾结点,不过,如果是插在指定下标位置,那么就需要遍历链表找到指定位置,从而降低了效率。

但是,使用LinkedList是不用担心扩容问题的,链表是不需要扩容的。

综上:

1.默认情况下,比如调用ArrayList和LinkedList的add(e)方法,都是插入在最后,如果这种操作比较多,那么就用LinkedList,因为不涉及到扩容。

2.如果调用ArrayList和LinkedList的add(index, e)方法比较多,就要具体考虑了,因为ArrayList可能会扩容,LinkedList需要遍历链表,这两种到底哪种更快,是没有结论的,得具体情况具体分析。

3.还有,如果是插入场景比较少,但经常需要查询的话,查询分两种,第一种就是普通遍历,也就是经常需要对List中的元素进行遍历,那么这两种是区别不大的,遍历链表和遍历数组的区别,第二种就是经常需要按指定下标获取List中的元素,如果这种情况如果比较多,那么就用ArrayList

以上,是对ArrayList和LinkedList在查询和插入之间的分析和对比。

大家如果还有其他对比思路或想法,可留言进行讨论。

另外,LinkedList还有一个特殊功能,LinkedList可以当做双端队列使用,这个是ArrayList不具备的。

这一点从源码也是看得出来的,ArrayList和LinkedList都实现了List接口,但是LinkedList还额外实现了Deque接口。

这个问题也是阿里面试的真题,希望大家有所收获,下面给大家分享大厂面试真题。欢迎扫下方名片来领取

 

用 ArrayList 还是 LinkedList?看完你就懂了!

本文旨在为 Java 开发这择合适的顺序数据结构提供指导。

ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。

1. List 接口

列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。

2. 用法

下面是使用 List 接口声明 ArrayList 和 LinkedList 的代码片段。

import java.util.*;
public class MyClass {
  // 非同步或非线程安全
  List<Object> arrayList = new ArrayList<>(); // 声明一个 array list
  List<Object> linkedList = new LinkedList(); // 声明 linked list
  // 确保线程安全
  List<Object> tsArrayList = Collections.synchronizedList(new LinkedList<>());
  List<Object> tsLinkedList = Collections.synchronizedList(new LinkedList<>());
}

Vector 与 ArrayList 类似,只是它们支持自动同步,这也使得 Vector 线程安全,但同时会带来一些性能损耗。

3. 内部实现

3.1 LinkedList 内部实现

Linkedlist 数据结构包含一组有序的数据元素,称为节点。每个元素都包含对其后续元素,即下一个元素的链接或引用。 序列的最后一个元素(尾部)指向空元素。链表本身包含对链表第一个元素的引用,该元素称为 head 元素。Java 中的 LinkedList 是 List 接口的双向链表。在双向链表中,每个节点都指向它的上一个节点和下一个节点。此外,它还实现了其他接口,比如 Serializable、 Cloneable 和 Deque(实现 Queue 作为父接口)。

3.2 ArrayList 内部实现

ArrayList 是可调整大小的数组,实现了 List 接口。 它的内部是一个对象数组,可以根据需要扩容支持在集合中加入更多元素。可以通过构造函数 ArrayList(int initialCapacity)指定 ArrayList 的初始容量,然后在必要时使用 void ensureCapacity(int minCapacity) 增加容量,确保至少可以容纳初始化时最小容量参数指定数量的元素。

它还提供一个方法 void trimToSize(),可以减少现有元素的大小。

// 调用构造函数 ArrayList<type>(initialCapacity)
List arr = new ArrayList<Integer>(10);

默认情况下,ArrayList 创建初始容量为10的列表,而 LinkedList 只构造一个没有设置任何初始容量的空列表。 Linkedlist 不实现 RandomAccess 接口,而 ArrayList 实现了 RandomAccess 接口(而非 Deque 接口)。

4. 各种操作的时空复杂性

5. 小贴士

考虑下面遍历 LinkedList 的示例代码。在这段代码中遍历会非常慢,因为 LinkedList 不支持随机访问,因此每次遍历都会带来巨大的开销。

LinkedList ll = new LinkedList();
…
…
Object o = null;
for (int i = 0; i < list.size(); i++)
{
  o = list.get(i);
  …
}

一个更好的方法可提高性能,像下面这段代码。

LinkedList ll = new LinkedList();
…
…
Object o = null;
ListIterator li = list.listIterator(0);
while (li.hasNext()){
  o = ll.next();
  …
}

6. 总结

相比较而言 ArrayList 更快而且更好,因为它支持对其元素的随机访问。 遍历链表或在中间插入新元素开销很大,因为必须遍历每个元素而且很可能遇到缓存失败。 如果需要在一次迭代中对列表中的多个项目执行处理,那么 LinkedList 的开销比 ArrayList 使用时多次复制数组元素的开销要小。

欢迎分享你对这个话题的经验与见解,请在文章的评论区中提出你的想法。

原文:https://dzone.com/articles/arraylist-or-linkedlist

翻译:唐尤华

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2021最新版)

2.别在再满屏的 if/ else 了,试试策略模式,真香!!

3.卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅发布,黑暗模式太炸了!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

以上是关于ArrayList和LinkedList区别?看完秒懂~的主要内容,如果未能解决你的问题,请参考以下文章

用 ArrayList 还是 LinkedList?看完你就懂了!

用 ArrayList 还是 LinkedList?看完你就懂了!

arraylist和linkedlist的区别

ArrayList和LinkedList区别,举例说明下

arraylist和linkedlist的区别

ArrayList和LinkedList的区别