Ch04-Java Collection 之 ArrayDeque

Ch04-Java Collection 之 ArrayDeque

January 31, 2017
Java | Collection
java

Java 里有一个叫做 Stack 的类,却没有叫做 Queue 的类 (它是个接口名字)。当需要使用栈时,Java 已不推荐使用 Stack,而是推荐使用更高效的 ArrayDeque;既然 Queue 只是一个接口,当需要使用队列时也就首选 ArrayDeque 了 (次选是 LinkedList)。

1. 底层数据结构 #

Deque 的含义是“double ended queue”,即双端队列,它既可以当作栈使用,也可以当作队列使用。它基于循环数组实现,也就是说数组的任何一点都可能被看作起点或者终点。ArrayDeque 是非线程安全的 (not thread-safe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入 null 元素。

arraydeque

head 指向首端第一个有效元素,tail 指向尾端第一个可以插入元素的空位。因为是循环数组,所以 head 不一定总等于 0,tail 也不一定总是比 head 大。

2. 接口定义 #

Deque 是"double ended queue", 表示双向的队列,英文读作"deck". Deque 继承自 Queue 接口,除了支持 Queue 的方法之外,还支持 insert, remove 和 examine 操作,由于 Deque 是双向的,所以可以对队列的头和尾都进行操作,它同时也支持两组格式,一组是抛出异常的实现;另外一组是返回值的实现 (没有则返回 null)。共 12 个方法如下:

Throws exception(head) Special value(head) Throws exception(tail) Special value(tail)
Insert addFirst(e) offerFirst(e) addLast(e)
Remove removeFirst() pollFirst() removeLast()
Examine getFirst() peekFirst() getLast()