

ArrayList和LinkedList的效率对比
source link: http://neoyeelf.github.io/2017/10/03/ArrayList%E5%92%8CLinkedList%E7%9A%84%E6%95%88%E7%8E%87%E5%AF%B9%E6%AF%94/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ArrayList和LinkedList的效率对比
List相信大家都使用得很多,其中ArrayList和LinkedList是使用最多的2个,本文将从源码角度解读2者的异同,效率和使用场景。
- LinkedList是靠一个名为Node的数据结构来存储数据和前后元素的指针,和双向链表类似。first和last分别存储了第一个和最后一个元素
其中item存储了实际的元素数据,next是指向了下一个元素,prev指向了前一个元素
- 而ArrayList直接通过
transient Object[] elementData
一个Object的数组存储数据
- ArrayList在插入之前需要通过ensureCapacityInternal方法先计算下加入一个元素后,elementData数组的大小和当前所需要的大小,若大于于当前数组的大小,则需要进行resize和arrayCopy操作。public boolean add(E e) {ensureCapacityInternal(size + 1);elementData[size++] = e;return true;
resize和arrayCopy主要通过下面的grow方法执行的
一般情况下,ArrayList的插入操作是O(1)的时间复杂度,但是当需要resize的时候为O(n);类似,add(int index, E element)
的时间复杂度一般是O(n/2),需要相应挪动插入的位置之后的元素。
- LinkedList的插入操作即在链表后加一个元素,先创建一个Node,当前插入的元素的prev指向last Node,将last赋值为当前插入Node。如果插入前的last不为null,则将last Node的next指向当前插入的元素;反之则将first也赋值为当前插入的Node(即空LinkedList插入元素后,last和first都指向同一个元素)public boolean add(E e) {linkLast(e);return true;void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;l.next = newNode;size++;modCount++;
LinkedList的插入操作的时间复杂度是O(1);相应的add(int index, E element)
的一般时间复杂度是O(n/4),从链表前后同时搜索,如果index=linkedlist.size()/2,那么是最坏情况,为O(n/2)
ArrayList直接根据数组下标获取相应的元素,所以时间复杂度为O(1),这也是ArrayList的最大的好处
public E get(int index) {rangeCheck(index);return elementData(index);而LinkedList需要从第一个或最后一个Node往中间遍历,所以其时间复杂度和
add(int index, E element)
类似,一般时间复杂度是O(n/4),最坏为O(n/2)
当删除某个元素时
remove(int index)
,ArrayList需要进行resize和arrayCopy操作,所以时间复杂度也为O(n/2)。只有当删除的是最后一个元素时,不用进行上述操作。public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;LinkedList删除操作和取元素的时间复杂度一样,因为也是要先通过node方法来找到要被删除的元素,再进行改变其前后元素的prev和next指针,所以其时间复杂度是O(n/4),最坏为O(n/2)
public E remove(int index) {checkElementIndex(index);return unlink(node(index));
Iterator
使用Iterator迭代器循环时,可以进行add和remove操作。
List<String> listA = new ArrayList<>();//List<String> listB = new LinkedList<>();ListIterator<String> iteratorA = listA.listIterator();while (iteratorA.hasNext()) {String temp = iteratorA.next();// iteratorA.add("some string");iteratorA.remove()System.out.println(listA.toString());ArrayList在迭代遍历时,add和remove操作的时间复杂度都为O(n/2),因为其需要将操作的元素之后的所有元素进行数组移位操作,即resize和arrayCopy
- LinkedList在迭代遍历时,add和remove操作的时间复杂度都为O(1),这也是LinkedList的主要优势
- ArrayList的优势在于随机快速读取,其直接在末尾插入元素的效率也很高。唯一需要注意的是,其resize的时候,需要一定的开销。所以如果你提前能预估ArrayList的大小,你可以在实例化时,给他赋一个initialCapacity,可以减小resize的次数。
- LinkedList的优势在于利用Iterator迭代器循环时,其插入和删除的效率都是最高的。
- 在存储空间上,LinkedList相比ArrayList的每个元素都有更多的开销,因为还存储了指向下一个和前一个元素的指针。所以如果你的list很大的话,这一点也需要考虑进去。
Recommend
-
67
本篇博客主要讲解List接口的三个实现类ArrayList、LinkedList、Vector的使用方法以及三者之间的区别。 1. ArrayList使用 ArrayList是List接口最常用的实现类,内部通过数组来实现,因此它的优点是适合随机查找和遍历...
-
20
ArrayList 应该是 Java 中最常用的集合类型了,以至于我们说到集合就会自然而然的想到 ArrayList。很多同学都没有用过除了 ArrayList 之外的其...
-
34
前言在一开始基础面的时候,很多面试官可能会问List集合一些基础知识,比如:ArrayList默认大小是多少,是如何扩容的?ArrayList和LinkedList的底层数据结构是什么?ArrayList和LinkedList的区别?分别用在什么场景?为什么说ArrayList查询快而增删慢?Arrays.asLi...
-
22
ArrayList 和LinkedList 是 List 接口的两种不同实现,并且两者都不是线程安全的。但初学者往往搞不清楚它们两者之间的区别,不知道什么时候该用 ArrayList,什么时候该用 LinkedList,那这篇文章就来传道受业解惑一下。
-
41
欢迎点击 “未读代码” ,关注公众号,文章每周更新说真的,在 Java 使用最多的集合类中,List 绝对占有一席之地的,它和 Map 一样适用于很多场...
-
11
本文主要讲述了ArrayList与LinkedList的相同以及不同之处,以及两者的底层实现(环境OpenJDK 11.0.10)。2 两者区别在详细介绍两者的底层实现之前,先来简单看一下两者的异同。2.1 相同点...
-
8
【注】本文译自: Java ArrayList vs LinkedList | Baeldung
-
2
请注意,本文编写于 126 天前,最后修改于 41 天前,其中某些信息可能已经过时。 ArrayList掌握扩容机制,首次扩容为 10,再次扩容为原 1.5 倍ArrayList 的构造函数,在 jdk1.8 中,ArrayList 有三种方式...
-
8
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。
-
10
JDK7 和JDK8的ArrayList的区别对比 精选 原创 爱学习的大鱼 2023-01-08 14:56:5...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK