Java 高级教程系列 - Deque 接口及其实现

Java Tutorial for Language Adavanced - Deque Interface and Implementations

Posted by zihengCat on 2019-05-06

Java 集合框架 Deque 接口

Java 集合框架中的Deque接口,其模型定义为:一种支持从双端插入或移除元素的线性表数据结构,是对队列结构的扩展,一般被称为双端队列(Double Ended Queue),简称 Deque

注:Deque读音为 deck ,不为 de queue

public interface Deque<E>
extends Queue<E>

代码清单:Deque接口声明

Java 集合Deque支持从队尾(Tail)或队头(Head)插入/移除元素,定义了操作双端队列的基本方法,为每项操作分别定义两种方法:一种方法在会在操作失败时抛出异常,另一种则会在操作失败时返回一个特殊值(false或null)标识操作失败。

下面对Deque接口方法作一个整理,以及对DequeQueue方法作个比较。

summary-of-deque-methods

表:Deque接口方法表

Queue Method Equivalent Deque Method
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

表:DequeQueue方法比较表

Deque接口实现类

Java 集合框架对Deque接口有几类实现:数组(Resizable Array)、链表(Linked List)。

  • ArrayDeque:数组实现

  • LinkedList:链表实现

Java 集合 Deque 使用示例

我们通过一个 Demo 代码示例来熟悉Deque的操作。

import java.util.Deque;
import java.util.ArrayDeque;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        /* Create a deque of strings */
        Deque<String> aDeque = new LinkedList<String>();
        /* Print deque details */
        showDeque("Deque", aDeque);
        /* Add a few elements to deque */
        aDeque.add("Java");
        aDeque.add("Python");
        /* Print deque details */
        showDeque("Deque", aDeque);
        /* Insert element from deque head */
        aDeque.offerFirst("JavaScript");
        showDeque("Deque", aDeque);
        /* Insert element from deque tail */
        aDeque.offerLast("C/C++");
        showDeque("Deque", aDeque);
        /* Use deque peek() and poll() method */
        while (!aDeque.isEmpty()) {
            String head = aDeque.peekFirst();
            String tail = aDeque.peekLast();
            System.out.printf(
                "Head = %s, Tail = %s" +
                System.getProperty("line.separator"),
                head, tail
            );
            aDeque.pollFirst();
            aDeque.pollLast();
        }
        /* Print deque details */
        showDeque("Deque", aDeque);
    }
    public static <T> void showDeque(String name, Deque<T> deque) {
        System.out.printf(
            "%s(%d): %s" +
            System.getProperty("line.separator"),
            name, deque.size(), deque.toString()
        );
    }
}

代码清单:Deque使用示例

Deque 用作 Stack

Deque数据结构也可以被用作Stack栈(LIFO),Java 官方也建议开发者使用Deque取代旧版Stack类。当Deque被当作栈使用时,元素都从队头(Head)出入栈。Deque也定义了栈的基本操作方法。

Stack Method Equivalent Deque Method
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

表:DequeStack方法比较表

import java.util.Deque;
import java.util.ArrayDeque;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        /* Create a stack of strings based on deque */
        Deque<String> aStack = new LinkedList<String>();
        /* Push elements to stack */
        aStack.push("Java");
        aStack.push("Python");
        aStack.push("JavaScript");
        aStack.push("C/C++");
        aStack.push("Golang");
        /* Print stack details */
        showDeque("Stack", aStack);
        /* Pop elements from stack */
        while (!aStack.isEmpty()) {
            String e = aStack.pop();
            System.out.println(e);
        }
        /* Print stack details */
        showDeque("Stack", aStack);
    }
    public static <T> void showDeque(String name, Deque<T> deque) {
        System.out.printf(
            "%s(%d): %s" +
            System.getProperty("line.separator"),
            name, deque.size(), deque.toString()
        );
    }
}

代码清单:Deque用作Stack使用示例

关联内容(Related Topics)

参考资料(References)