现在网上大部分都说,ArrayList查询速度快,LinkedList增删速度快。其实这种说法是错误的。ArrayList底层是数组,在每次进行添加的时候实际上是在数组后面进行追加,在调用扩容机制grow,数组复制的时候,用到的语句底层是用C语言进行书写的,所以对效率的影响可以忽略不计(C语言执行效率较高)。而LinkedList在添加的时候是在创建对象。
ArrayList在查询的时候,实际上就是根据数组下标来获取值,而LinkedList是前后迭代式获取值,故ArrayList的查询速度是优于LinkedList的
总结:
在百万级数据以下其实ArrayList的增删速度实际上还是要优于LinkedList的,百万级数据以上如果还是向后追加的话,ArrayList速度还是要优于LinkedList速度的,如何数据量在百万级数据的时候建议用LinkedList,在我们实际的开发中需要一次进行处理这么大的数据量几乎没有。所以ArrayList的速度还是要优于LinkedList的。
原文链接:https://blog.csdn.net/Luisc_/article/details/93035810
两者关系:
什么是ArrayList
1. ArrayList 定义:
arraylist是动态数组,从数据结构上来讲,是数组实现的线性表(即顺序表)。
2. arraylist的特点:
①.容量不固定,想放多少放多少(当size大于capacity的时候,自动进行1.5倍扩容;添加的时候,容量加一)
②.有序的(元素输出顺序与输入顺序一致)
③.元素可以为 null
④.元素不唯一(可重复)
⑤.不同步,与之对应的是,vector是同步的
⑥.可以通过索引直接操作元素,而set不行
3. arraylist的主要成员变量:
Ⅰ.capacity:数组容量(长度),默认是10
Ⅱ.size:当前元素个数
什么是LinkedList
1. 概述
LinkedList 是 Java 集合中比较常用的数据结构,与 ArrayList 一样,实现了 List 接口,只不过 ArrayList 是基于数组实现的,而 LinkedList 是基于链表实现的。所以 LinkedList 插入和删除方面要优于 ArrayList,而随机访问上则 ArrayList 性能更好。
除了 LIst 接口之外,LinkedList 还实现了 Deque,Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。
2. LinkedList的定义:
LinkedList 是链表实现的线性表(双链表)
3. 双链表中的结点结构图:
4. linkedlist的意义:
我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入、删除时都需要移动后面的元素,效率略差些。而LinkedList 是以链表实现的,插入、删除时只需要改变前后两个节点指针指向即可,省事不少。
5. LinkedList 特点:
·①双向链表实现
·②元素是有序的,输出顺序与输入顺序一致
·③允许元素为 null
·④要找到某个结点,必须从头开始遍历。(查询慢,增删快)
·⑤和 ArrayList 一样,不是同步容器
6. 注意:
由于linkedlist不是同步的,所以想要线程安全的时候,需要直接在初始化时用 Collections.synchronizedList 方法进行包装。
ArrayList 和 LinkedList 的区别是什么
1. 区别:
· 数组(ArrayList)的随机访问速度非常快,但是指定位置添加、删除操作时需要将后续元素全部顺移。
· LinkedList则恰恰相反,我们在使用链表做指定位置的添加删除操作时,所需的操作非常少,但随机访问速度却非常慢。
· ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。
2. 注意:
· 如果频繁在尾部进行添加、删除操作,动态数组、双向链表均可选择
· 如果频繁在头部进行添加、删除操作,建议选择使用双向链表
· 如果有频繁的(在任意位置)添加、删除操作,建议选择使用双向链表
· 如果有频繁的查询操作(随机访问操作),建议选择使用动态数组