ArrayDeque和 LinkedList
接口 Deque
接口 Deque 继承自 Queue 即队列, 在 Java 中队列有两种形式,单向队列( AbstractQueue ) 和 双端队列( Deque ),只能从一端进入,另外一端出去。
而双端队列( Deque ), Deque 是双端队列的线性数据结构, 可以在两端进行插入和删除操作。
双端队列( Deque )的子类分别是 ArrayDeque 和 LinkedList,ArrayDeque 基于数组实现的双端队列,而 LinkedList 基于双向链表实现的双端队列。
ArrayDeque 具有以下特点:
- 因为双端队列只能在头部和尾部插入或者删除元素,所以时间复杂度为
O(1),但是在扩容的时候需要批量移动元素,其时间复杂度为O(n) - 扩容的时候,将数组长度扩容为原来的 2 倍,即
n << 1 - 数组采用连续的内存地址空间,所以查询的时候,时间复杂度为
O(1) - 它是非线程安全的集合
LinkedList 具有以下特点:
LinkedList是基于双向链表的结构来存储元素,所以长度没有限制,因此不存在扩容机制- 由于链表的内存地址是非连续的,所以只能从头部或者尾部查找元素,查询的时间复杂为
O(n),但是 JDK 对LinkedList做了查找优化,当我们查找某个元素时,若index < (size / 2),则从head往后查找,否则从tail开始往前查找 , 但是我们在计算时间复杂度的时候,常数项可以省略,故时间复杂度O(n)
- 链表通过指针去访问各个元素,所以插入、删除元素只需要更改指针指向即可,因此插入、删除的时间复杂度
O(1) - 它是非线程安全的集合
ArrayDeque 比 LinkedList 效率高
-
从速度的角度:
ArrayDeque基于数组实现双端队列,而LinkedList基于双向链表实现双端队列,数组采用连续的内存地址空间,通过下标索引访问,链表是非连续的内存地址空间,通过指针访问,所以在寻址方面数组的效率高于链表。 -
从内存的角度:虽然
LinkedList没有扩容的问题,但是插入元素的时候,需要创建一个Node对象, 换句话说每次都要执行new操作,当执行new操作的时候,其过程是非常慢的,会经历两个过程:类加载过程 、对象创建过程。

浙公网安备 33010602011771号