# Deque 实现

> 原文： [https://docs.oracle.com/javase/tutorial/collections/implementations/deque.html](https://docs.oracle.com/javase/tutorial/collections/implementations/deque.html)

`Deque`接口，发音为 _“deck”_，表示双端队列。 `Deque`接口可以实现为各种类型的`Collections`。 `Deque`接口实现分为通用和并发实现。

## 通用 Deque 实现

通用实现包括`LinkedList`和`ArrayDeque`类。 `Deque`接口支持两端元素的插入，移除和检索。 [`ArrayDeque`](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.html) 类是`Deque`接口的可调整大小的数组实现，而 [`LinkedList`](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html) 类是列表实现。

`Deque`接口`addFirst`，`addLast`，`removeFirst`，`removeLast`，`getFirst`和`getLast`的基本插入，移除和回溯操作。方法`addFirst`在头部添加元素，而`addLast`在`Deque`实例的尾部添加元素。

`LinkedList`实现比`ArrayDeque`实现更灵活。 `LinkedList`实现所有可选列表操作。 `null`实现中允许`null`元素，但`ArrayDeque`实现中不允许。

在效率方面，`ArrayDeque`比`LinkedList`在两端添加和删除操作更有效。 `LinkedList`实现中的最佳操作是在迭代期间删除当前元素。 `LinkedList`实现不是迭代的理想结构。

`LinkedList`实现比`ArrayDeque`实现消耗更多内存。对于`ArrayDeque`实例遍历，请使用以下任何一种方法：

### 的 foreach

`foreach`速度快，可用于各种列表。

```
ArrayDeque<String> aDeque = new ArrayDeque<String>();

. . .
for (String str : aDeque) {
    System.out.println(str);
}

```

### 迭代器

`Iterator`可用于各类数据的各种列表的正向遍历。

```
ArrayDeque<String> aDeque = new ArrayDeque<String>();
. . .
for (Iterator<String> iter = aDeque.iterator(); iter.hasNext();  ) {
    System.out.println(iter.next());
}

```

本教程中使用`ArrayDeque`类来实现`Deque`接口。本教程中使用的示例的完整代码可在 [``ArrayDequeSample``](../interfaces/examples/ArrayDequeSample.java)中找到。 `LinkedList`和`ArrayDeque`类都不支持多线程的并发访问。

## 并发 Deque 实现

[`LinkedBlockingDeque`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/LinkedBlockingDeque.html) 类是`Deque`接口的并发实现。如果 deque 为空，则`takeFirst`和`takeLast`等方法会等到元素变为可用，然后检索并删除相同的元素。