原文: https://www.programiz.com/java-programming/arraydeque

在本教程中,我们将借助示例学习ArrayDeque类及其方法。 此外,我们还将学习使用数组双端队列来实现栈。

在 Java 中,我们可以使用ArrayDeque类使用数组实现队列和双端队列数据结构。


ArrayDeque实现的接口

ArrayDeque类实现以下两个接口:

Java `ArrayDeque` - 图1


创建ArrayDeque

为了创建数组双端队列,我们必须导入java.util.ArrayDeque包。

这是我们可以用 Java 创建数组双端队列的方法:

  1. ArrayDeque<Type> animal = new ArrayDeque<>();

在此,Type表示数组双端队列的类型。 例如,

  1. // Creating String type ArrayDeque
  2. ArrayDeque<String> animals = new ArrayDeque<>();
  3. // Creating Integer type ArrayDeque
  4. ArrayDeque<Integer> age = new ArrayDeque<>();

ArrayDeque方法

ArrayDeque类提供了QueueDeque接口中存在的所有方法的实现。


将元素插入双端队列

1.使用add()addFirst()addLast()添加元素

  • add() - 在数组双端队列的末尾插入指定的元素
  • addFirst() - 将指定的元素插入数组双端队列的开头
  • addLast() - 在数组双端队列的末尾插入指定的内容(相当于add()

注意:如果数组双端队列已满,则所有这些方法add()addFirst()addLast()都会抛出IllegalStateException

例如,

  1. import java.util.ArrayDeque;
  2. class Main {
  3. public static void main(String[] args) {
  4. ArrayDeque<String> animals= new ArrayDeque<>();
  5. // Using add()
  6. animals.add("Dog");
  7. // Using addFirst()
  8. animals.addFirst("Cat");
  9. // Using addLast()
  10. animals.addLast("Horse");
  11. System.out.println("ArrayDeque: " + animals);
  12. }
  13. }

输出

  1. ArrayDeque: [Cat, Dog, Horse]

2.使用offer()offerFirst()offerLast()插入元素

  • offer() - 在数组双端队列的末尾插入指定的元素
  • offerFirst() - 将指定的元素插入数组双端队列的开头
  • offerLast() - 在数组双端队列的末尾插入指定的元素

注意:如果成功插入元素,则offer()offerFirst()offerLast()返回true; 如果数组双端队列已满,则这些方法返回false

例如:

  1. import java.util.ArrayDeque;
  2. class Main {
  3. public static void main(String[] args) {
  4. ArrayDeque<String> animals= new ArrayDeque<>();
  5. // Using offer()
  6. animals.offer("Dog");
  7. // Using offerFirst()
  8. animals.offerFirst("Cat");
  9. // Using offerLast()
  10. animals.offerLast("Horse");
  11. System.out.println("ArrayDeque: " + animals);
  12. }
  13. }

输出

  1. ArrayDeque: [Cat, Dog, Horse]

注意:如果数组双端队列已满

  • add()方法将引发异常
  • offer()方法返回false

访问ArrayDeque元素

1.使用getFirst()getLast()访问元素

  • getFirst() - 返回数组双端队列的第一个元素
  • getLast() - 返回数组双端队列的最后一个元素

注意:如果数组双端队列为空,则getFirst()getLast()抛出NoSuchElementException

例如:

  1. import java.util.ArrayDeque;
  2. class Main {
  3. public static void main(String[] args) {
  4. ArrayDeque<String> animals= new ArrayDeque<>();
  5. animals.add("Dog");
  6. animals.add("Cat");
  7. animals.add("Horse");
  8. System.out.println("ArrayDeque: " + animals);
  9. // Get the first element
  10. String firstElement = animals.getFirst();
  11. System.out.println("First Element: " + firstElement);
  12. // Get the last element
  13. String lastElement = animals.getLast();
  14. System.out.println("Last Element: " + lastElement);
  15. }
  16. }

输出

  1. ArrayDeque: [Dog, Cat, Horse]
  2. First Element: Dog
  3. Last Element: Horse

2.使用peek()peekFirst()peekLast()方法访问元素

  • peek() - 返回数组双端队列的第一个元素
  • peekFirst() - 返回数组双端队列的第一个元素(相当于peek()
  • peekLast() - 返回数组双端队列的最后一个元素

例如:

  1. import java.util.ArrayDeque;
  2. class Main {
  3. public static void main(String[] args) {
  4. ArrayDeque<String> animals= new ArrayDeque<>();
  5. animals.add("Dog");
  6. animals.add("Cat");
  7. animals.add("Horse");
  8. System.out.println("ArrayDeque: " + animals);
  9. // Using peek()
  10. String element = animals.peek();
  11. System.out.println("Head Element: " + element);
  12. // Using peekFirst()
  13. String firstElement = animals.peekFirst();
  14. System.out.println("First Element: " + firstElement);
  15. // Using peekLast
  16. String lastElement = animals.peekLast();
  17. System.out.println("Last Element: " + lastElement);
  18. }
  19. }

输出

  1. ArrayDeque: [Dog, Cat, Horse]
  2. Head Element: Dog
  3. First Element: Dog
  4. Last Element: Horse

注意:如果数组双端队列为空,则peek()peekFirst()getLast()抛出NoSuchElementException


删除ArrayDeque元素

1.使用remove()removeFirst()removeLast()方法删除元素

  • remove() - 从数组双端队列的第一个元素中返回并删除一个元素
  • remove(element) - 从数组双端队列的头部返回并删除指定的元素
  • removeFirst() - 返回并从数组双端队列中删除第一个元素(等效于remove()
  • removeLast() - 返回并删除数组双端队列中的最后一个元素

注意:如果数组双端队列为空,则remove()removeFirst()removeLast()方法将引发异常。 另外,如果找不到该元素,则remove(element)会引发异常。

例如:

  1. import java.util.ArrayDeque;
  2. class Main {
  3. public static void main(String[] args) {
  4. ArrayDeque<String> animals= new ArrayDeque<>();
  5. animals.add("Dog");
  6. animals.add("Cat");
  7. animals.add("Cow");
  8. animals.add("Horse");
  9. System.out.println("ArrayDeque: " + animals);
  10. // Using remove()
  11. String element = animals.remove();
  12. System.out.println("Removed Element: " + element);
  13. System.out.println("New ArrayDeque: " + animals);
  14. // Using removeFirst()
  15. String firstElement = animals.removeFirst();
  16. System.out.println("Removed First Element: " + firstElement);
  17. // Using removeLast()
  18. String lastElement = animals.removeLast();
  19. System.out.println("Removed Last Element: " + lastElement);
  20. }
  21. }

输出

  1. ArrayDeque: [Dog, Cat, Cow, Horse]
  2. Removed Element: Dog
  3. New ArrayDeque: [Cat, Cow, Horse]
  4. Removed First Element: Cat
  5. Removed Last Element: Horse

2.使用poll()pollFirst()pollLast()方法删除元素

  • poll() - 返回并删除数组双端队列的第一个元素
  • pollFirst() - 返回并删除数组双端队列的第一个元素(相当于poll()
  • pollLast() - 返回并删除数组双端队列的最后一个元素

注意:如果数组双端队列为空,则如果找不到该元素,则poll()pollFirst()pollLast()返回null

例如:

  1. import java.util.ArrayDeque;
  2. class Main {
  3. public static void main(String[] args) {
  4. ArrayDeque<String> animals= new ArrayDeque<>();
  5. animals.add("Dog");
  6. animals.add("Cat");
  7. animals.add("Cow");
  8. animals.add("Horse");
  9. System.out.println("ArrayDeque: " + animals);
  10. // Using poll()
  11. String element = animals.poll();
  12. System.out.println("Removed Element: " + element);
  13. System.out.println("New ArrayDeque: " + animals);
  14. // Using pollFirst()
  15. String firstElement = animals.pollFirst();
  16. System.out.println("Removed First Element: " + firstElement);
  17. // Using pollLast()
  18. String lastElement = animals.pollLast();
  19. System.out.println("Removed Last Element: " + lastElement);
  20. }
  21. }

输出

ArrayDeque: [Dog, Cat, Cow, Horse]
Removed Element: Dog
New ArrayDeque: [Cat, Cow, Horse]
Removed First Element: Cat
Removed Last Element: Horse

3.删除元素:使用clear()方法

要从数组双端队列中删除所有元素,我们使用clear()方法。 例如,

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayDeque: " + animals);

        // Using clear()
        animals.clear();

        System.out.println("New ArrayDeque: " + animals);
    }
}

输出

ArrayDeque: [Dog, Cat, Horse]
New ArrayDeque: []

迭代ArrayDeque

  • iterator() - 返回可用于遍历数组双端队列的迭代器
  • descendingIterator() - 返回一个迭代器,该迭代器可用于以相反顺序遍历数组双端队列

为了使用这些方法,我们必须导入java.util.Iterator包。 例如,

import java.util.ArrayDeque;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");

        System.out.print("ArrayDeque: ");

        // Using iterator()
        Iterator<String> iterate = animals.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }

        System.out.print("\nArrayDeque in reverse order: ");
        // Using descendingIterator()
        Iterator<String> desIterate = animals.descendingIterator();
        while(desIterate.hasNext()) {
            System.out.print(desIterate.next());
            System.out.print(", ");
        }
    }
}

输出

ArrayDeque: [Dog, Cat, Horse]
ArrayDeque in reverse order: [Horse, Cat, Dog]

其他方法

方法 内容描述
element() 从数组双端队列的头部返回一个元素。
contains(element) 在数组双端队列中搜索指定的元素。
如果找到该元素,则返回true,否则返回false
size() 返回数组双端队列的长度。
toArray() 将数组双端队列转换为数组并返回。
clone() 创建数组双端队列的副本并返回它。

ArrayDeque作为栈

要在 Java 中实现 LIFO(后进先出)栈,建议在栈类上使用双端队列。ArrayDeque类可能比Stack类快。

ArrayDeque提供了以下可用于实现栈的方法。

  • push() - 将元素添加到栈顶部
  • peek() - 从栈顶部返回一个元素
  • pop() - 返回并从栈顶部删除元素

例如:

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> stack = new ArrayDeque<>();

        // Add elements to stack
        stack.push("Dog");
        stack.push("Cat");
        stack.push("Horse");
        System.out.println("Stack: " + stack);

        // Access element from top of stack
        String element = stack.peek();
        System.out.println("Accessed Element: " + element);

        // Remove elements from top of stack
        String remElement = stack.pop();
        System.out.println("Removed element: " + remElement);
    }
}

输出

Stack: [Horse, Cat, Dog]
Accessed Element: Horse
Removed Element: Horse

ArrayDequeLinkedList

ArrayDequeJava LinkedList 都实现了Deque接口。 但是,它们之间存在一些差异。

  • LinkedList支持null元素,而ArrayDeque不支持。
  • 链表中的每个节点都包含指向其他节点的链接。 这就是LinkedListArrayDeque需要更多存储空间的原因。
  • 如果要实现队列或双端队列数据结构,则ArrayDeque可能比LinkedList快。