Java Deque接口及示例
java.util包中的 Deque 接口是队列接口的一个子类型。Deque与双端队列有关,支持从数据结构的任何一端添加或删除元素。它既可以作为一个队列(先进先出/FIFO),也可以作为一个堆栈(后进先出/LIFO)使用。Deque是双端队列的首字母缩写。

语法: deque接口被声明为。
public interface Deque extends Queue
创建Deque对象 因为Deque是一个接口,所以不能创建deque类型的对象。我们总是需要一个扩展这个列表的类来创建一个对象。而且,在Java 1.5中引入泛型后,可以限制Deque中可以存储的对象的类型。这个类型安全的队列可以定义为:。
// Obj is the type of the object to be stored in Deque Deque<Obj> deque = new ArrayDeque<Obj> ();
例子: Deque
// Java program to demonstrate the working
// of a Deque in Java
import java.util.*;
public class DequeExample {
public static void main(String[] args)
{
Deque<String> deque
= new LinkedList<String>();
// We can add elements to the queue
// in various ways
// Add at the last
deque.add("Element 1 (Tail)");
// Add at the first
deque.addFirst("Element 2 (Head)");
// Add at the last
deque.addLast("Element 3 (Tail)");
// Add at the first
deque.push("Element 4 (Head)");
// Add at the last
deque.offer("Element 5 (Tail)");
// Add at the first
deque.offerFirst("Element 6 (Head)");
System.out.println(deque + "\n");
// We can remove the first element
// or the last element.
deque.removeFirst();
deque.removeLast();
System.out.println("Deque after removing "
+ "first and last: "
+ deque);
}
}
输出:
[Element 6 (Head), Element 4 (Head), Element 2 (Head), Element 1 (Tail), Element 3 (Tail), Element 5 (Tail)] Deque after removing first and last: [Element 4 (Head), Element 2 (Head), Element 1 (Tail), Element 3 (Tail)]
使用Deque接口和ArrayDeque类的操作
让我们看看如何使用ArrayDeque类对deque进行一些常用的操作。
1.添加元素: 为了在deque中添加一个元素,我们可以使用add()方法。队列和deque之间的区别是,在deque中,添加可以从任何方向进行。因此,还有另外两个方法,名为addFirst()和addLast(),用于在两端添加元素。
// Java program to demonstrate the
// addition of elements in deque
import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args)
{
// Initializing an deque
Deque<String> dq
= new ArrayDeque<String>();
// add() method to insert
dq.add("For");
dq.addFirst("Geeks");
dq.addLast("Geeks");
System.out.println(dq);
}
}
输出
[Geeks, For, Geeks]
2.移除元素: 为了从deque中移除一个元素,有多种方法可用。由于我们也可以从两端移除,deque接口为我们提供了 removeFirst(), removeLast() 方法。除此之外,这个接口还为我们提供了poll()、pop()、pollFirst()、pollLast()方法,其中pop()是用来删除和返回deque的头部。然而,poll()的使用是因为它提供了与pop()相同的功能,并且在deque为空时不会返回一个异常。
// Java program to demonstrate the
// removal of elements in deque
import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args)
{
// Initializing an deque
Deque<String> dq
= new ArrayDeque<String>();
// add() method to insert
dq.add("For");
dq.addFirst("Geeks");
dq.addLast("Geeks");
System.out.println(dq);
System.out.println(dq.pop());
System.out.println(dq.poll());
System.out.println(dq.pollFirst());
System.out.println(dq.pollLast());
}
}
输出
[Geeks, For, Geeks]
Geeks
For
Geeks
null
3. 迭代 deque: 由于deque可以从两个方向迭代,deque接口的迭代器方法为我们提供了两种迭代的方式。一种是从第一个方向,另一种是从后面。
// Java program to demonstrate the
// iteration of elements in deque
import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args)
{
// Initializing an deque
Deque<String> dq
= new ArrayDeque<String>();
// add() method to insert
dq.add("For");
dq.addFirst("Geeks");
dq.addLast("Geeks");
dq.add("is so good");
for (Iterator itr = dq.iterator();
itr.hasNext();) {
System.out.print(itr.next() + " ");
}
System.out.println();
for (Iterator itr = dq.descendingIterator();
itr.hasNext();) {
System.out.print(itr.next() + " ");
}
}
}
输出
Geeks For Geeks is so good
is so good Geeks For Geeks
实现Deque接口的类是ArrayDeque 。
ArrayDeque : 在集合框架中实现的ArrayDeque类为我们提供了一种应用可调整大小的数组的方法。这是一种特殊的数组,可以增长,并允许用户从队列的两边添加或删除一个元素。阵列deques没有容量限制,它们根据需要增长以支持使用。它们不是线程安全的,这意味着在没有外部同步的情况下,ArrayDeque不支持多线程的并发访问。ArrayDeque类作为堆栈使用时,可能比Stack快。ArrayDeque类在作为队列使用时,可能比LinkedList更快。让我们看看如何使用这个类来创建一个队列对象。
// Java program to demonstrate the
// creation of deque object using the
// ArrayDeque class in Java
import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args)
{
// Initializing an deque
Deque<Integer> de_que
= new ArrayDeque<Integer>(10);
// add() method to insert
de_que.add(10);
de_que.add(20);
de_que.add(30);
de_que.add(40);
de_que.add(50);
System.out.println(de_que);
// clear() method
de_que.clear();
// addFirst() method to insert the
// elements at the head
de_que.addFirst(564);
de_que.addFirst(291);
// addLast() method to insert the
// elements at the tail
de_que.addLast(24);
de_que.addLast(14);
System.out.println(de_que);
}
}
输出
[10, 20, 30, 40, 50]
[291, 564, 24, 14]
Deque接口的方法
以下是deque接口中的方法。
| 方法 | 描述 |
|---|---|
| add(element) | 这个方法用来在队列的尾部添加一个元素。如果Deque有容量限制,没有空间可供插入,它会返回IllegalStateException。该函数在成功插入时返回true。 |
| addFirst(element) | 这个方法用来在队列的头部添加一个元素。如果Deque有容量限制,没有空间可以插入,它会返回IllegalStateException。该函数在成功插入时返回true。 |
| addLast(element) | 这个方法用来在队列的尾部添加一个元素。如果Deque有容量限制,没有空间可以插入,它会返回IllegalStateException。该函数在成功插入时返回true。 |
| contains() | 该方法用于检查队列是否包含给定的对象。 |
| descendingIterator() | 该方法返回deque的一个迭代器。元素将按照从最后一个(tail)到第一个(head)的顺序返回。 |
| element() | 这个方法用于检索,但不是删除,这个deque所代表的队列的头部。 |
| getFirst() | 这个方法用来检索,但不是删除,这个deque的第一个元素。 |
| getLast() | 这个方法用来检索,但不是删除,这个deque的最后一个元素。 |
| iterator() | 该方法返回deque的一个迭代器。元素将按照从第一个(头)到最后一个(尾)的顺序返回。 |
| offer(element) | 这个方法用于在队列的尾部添加一个元素。这个方法比add()方法更好,因为这个方法在容器容量满的时候不会抛出一个异常,因为它返回false。 |
| offerFirst(element) | 这个方法用来在队列的头部添加一个元素。这个方法比addFirst()方法更好,因为这个方法不会在容器容量已满时抛出一个异常,因为它返回false。 |
| offerLast(element) | 这个方法用来在队列的尾部添加一个元素。这个方法比add()方法更好,因为这个方法不会在容器容量已满时抛出一个异常,因为它返回false。 |
| peek() | 这个方法用于检索deque头部的元素,但不从deque中移除元素。如果deque是空的,该方法返回null。 |
| peekFirst() | 该方法用于检索deque头部的元素,但不从deque中移除该元素。如果deque是空的,该方法返回null。 |
| peekLast() | 该方法用于检索deque尾部的元素,但不从deque中移除该元素。如果deque是空的,该方法返回null。 |
| poll() | 该方法用于检索和删除deque头部的元素。如果deque是空的,该方法返回null。 |
| pollFirst() | 该方法用于检索和删除deque头部的元素。如果deque是空的,该方法返回null。 |
| pollLast() | 该方法用于检索和删除deque尾部的元素。如果deque是空的,该方法返回null。 |
| pop() | 该方法用于从头部移除一个元素并返回。 |
| push(element) | 该方法用于在队列的头部添加一个元素。 |
| removeFirst() | 该方法用于从队列的头部移除一个元素。 |
| removeLast() | 这个方法用来从队列的尾部移除一个元素。 |
| size() | 该方法用于查找并返回deque的大小。 |
极客教程