ArrayDeque,LinkedList这两者都可以用作队列和栈
下面是Stack,ArrayDeque,LinkedList的区别:
类继承树
由继承树看出,三者都是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
感觉上,只要底层是数组的就比底层是链表的随机访问效率高,插入删除效率低
原文链接: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。
复制代码
近期评论