Stack,ArrayDeque,LinkedList的区别

ArrayDeque,LinkedList这两者都可以用作队列和栈

 

下面是Stack,ArrayDeque,LinkedList的区别:

类继承树

Collection继承树

由继承树看出,三者都是Collection的间接实现类。
ArrayDeque实现Deque接口,Stack继承于Vector,LinkedList实现Deque与List接口

区别

底层数据存储方式

  存储方式
Stack 长度为10的数组
ArrayDeque 长度为16的数组
LinkedList 链表

 方法参照表 

Stack ArrayDeque LinkedList
push(e) addFirst(e)/offerFirst(e) addFirst(e)/offerFirst(e)
pop() removeFirst()/pollFirst() removeFirst()/pollFirst()
peek() getFirst()/peekFirst() getFirst()/peekFirst()

线程安全

  线程安全
Stack 线程同步
ArrayDeque 线程不同步
LinkedList 线程不同步

性能选项

     通常情况下,不推荐使用Vector以及其子类Stack

1.需要线程同步

    使用Collections工具类中synchronizedXxx()将线程不同步的ArrayDeque以及LinkedList转换成线程同步。

2.频繁的插入、删除操作:LinkedList

3.频繁的随机访问操作:ArrayDeque

4.未知的初始数据量:LinkedList

感觉上,只要底层是数组的就比底层是链表的随机访问效率高,插入删除效率低

原文链接:blog.csdn.net/cartoon_/ar…

其他:

队列与栈的声明

//栈
Deque<Integer> stack = new ArrayDeque<Integer>();
//ArrayDeque 是 Deque 接口的一种具体实现,是依赖于可变数组来实现的。
//ArrayDeque 没有容量限制,可根据需求自动进行扩容。ArrayDeque 可以作为栈来使用,效率要高于 Stack。
//ArrayDeque 也可以作为队列来使用,效率相较于基于双向链表的 LinkedList 也要更好一些。
//注意,ArrayDeque 不支持为 null 的元素。
//Java 中的 Deuqe,即 “double ended queue” 的缩写,是 Java 中的双端队列集合类型
//注意stack已经不用了,因为它继承自vector,这个vector已经不用了
//相较于addLast()这个offerLast是boolean类型的,会返回插入成功与否
复制代码
//队列
Queue<String> queue = new LinkedList<String>();
**offer,add 区别:**

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

**poll,remove 区别:**

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

**peek,element区别:**

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
复制代码

队列的用法