Collections框架--Queue接口

x33g5p2x  于2022-10-06 转载在 其他  
字(5.5k)|赞(0)|评价(0)|浏览(531)

在本指南中,我们将学习Queue接口、它的方法和它的实现类。

队列接口概述

队列是一个用于在处理前保存元素的集合。除了基本的集合操作,队列还提供额外的insertion, removalinspection操作。

Java库中的队列接口源代码。

public interface Queue<E> extends Collection<E> {
    E element();
    boolean offer(E e);
    E peek();
    E poll();
    E remove();
}

队列接口方法

每个队列方法都以两种形式存在。

如果操作失败,这些方法会抛出一个异常

  • boolean add(E e) - 如果在不违反容量限制的情况下可以立即插入指定的元素,则该方法会在成功后返回true,如果当前没有可用空间,则会抛出IllegalStateException。

  • E element() - 这个方法检索,但不删除这个队列的头部。

  • E remove() - 这个方法检索并删除这个队列的头部。
    **如果操作失败,这些方法会返回一个特殊的值(要么为空,要么为假,取决于操作)。

  • boolean offer(E e) - 如果有可能在不违反容量限制的情况下立即插入指定的元素到这个队列中,那么这个方法就可以插入。

  • E peek() - 这个方法检索,但不删除这个队列的头部,如果这个队列是空的,则返回null。

  • E poll() - 这个方法检索并删除这个队列的头,如果这个队列是空的,则返回null。

队列接口类图

下图显示了Queue接口提供的方法列表。

Queue interface Hierarchy Diagram

Queue接口扩展了Collection接口并提供了额外的insertion, removalinspection操作。

队列接口与它的链接列表实现类示例 

使用LinkedList实现类创建一个队列,并执行Enqueue和Dequeue等基本操作。

import java.util.LinkedList;
import java.util.Queue;

/**
* Demonstrate Queue interface methods with LinkedList implementation.
* @author javaguides.net
*
*/
public class QueueExample {
    public static void main(String[] args) {
        // Create and initialize a Queue using a LinkedList
        Queue<String> elementQueue = new LinkedList<>();

        // Adding new elements to the Queue (The Enqueue operation)
        elementQueue.add("element1");
        elementQueue.add("element2");
        elementQueue.add("element3");
        elementQueue.add("element4");

        System.out.println("WaitingQueue : " + elementQueue);

        // Removing an element from the Queue using remove() (The Dequeue operation)
        // The remove() method throws NoSuchElementException if the Queue is empty
        String name = elementQueue.remove();
        System.out.println("Removed from WaitingQueue : " + name + " | New WaitingQueue : " + elementQueue);

        // Removing an element from the Queue using poll()
        // The poll() method is similar to remove() except that it returns null if the Queue is empty.
        name = elementQueue.poll();
        System.out.println("Removed from WaitingQueue : " + name + " | New WaitingQueue : " + elementQueue);
    }
}

输出:

WaitingQueue : [element1, element2, element3, element4]
Removed from WaitingQueue : element1 | New WaitingQueue : [element2, element3, element4]
Removed from WaitingQueue : element2 | New WaitingQueue : [element3, element4]

队列接口方法 - isEmpty(), size(), element(), peek()

让我们用例子来证明队列接口方法 - isEmpty(), size(), element(),peek()

  • 检查一个队列是否是空的。
  • 查找队列的大小。
  • 在队列中搜索一个元素。
  • 获取队列中最前面的元素而不删除它。
import java.util.LinkedList;
import java.util.Queue;

/**
* Demonstrate Queue interface methods with LinkedList implementation.
* @author javaguides.net
*
*/

public class QueueSizeSearchFrontExample {
    public static void main(String[] args) {
        Queue<String> elementQueue = new LinkedList<>();

        elementQueue.add("element1");
        elementQueue.add("element2");
        elementQueue.add("element3");
        elementQueue.add("element4");

        System.out.println("WaitingQueue : " + elementQueue);

        // Check is a Queue is empty
        System.out.println("is waitingQueue empty? : " + elementQueue.isEmpty());

        // Find the size of the Queue
        System.out.println("Size of waitingQueue : " + elementQueue.size());

        // Check if the Queue contains an element
        String name = "Johnny";
        if(elementQueue.contains(name)) {
            System.out.println("WaitingQueue contains " + name);
        } else {
            System.out.println("Waiting Queue doesn't contain " + name);
        }

        // Get the element at the front of the Queue without removing it using element()
        // The element() method throws NoSuchElementException if the Queue is empty
        String firstElementInTheWaitingQueue =  elementQueue.element();
        System.out.println("Waiting Queue (element()) : " + firstElementInTheWaitingQueue);

        // Get the element at the front of the Queue without removing it using peek()
        // The peek() method is similar to element() except that it returns null if the Queue is empty
        firstElementInTheWaitingQueue = elementQueue.peek();
        System.out.println("Waiting Queue : " + firstElementInTheWaitingQueue);

    }
}

输出。

WaitingQueue : [element1, element2, element3, element4]
is waitingQueue empty? : false
Size of waitingQueue : 4
Waiting Queue doesn't contain Johnny
Waiting Queue (element()) : element1
Waiting Queue : element1

在Java中对队列进行迭代

本节中的例子展示了在队列上迭代的各种方法。

  • 使用Java 8 forEach()方法遍历队列。
  • 使用iterator()对队列进行迭代。
  • 使用iterator()和Java 8 forEachRemaining()方法遍历队列。
  • 使用一个简单的for-each循环对队列进行迭代。
  • 队列中的迭代顺序与插入顺序相同。
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

/**
* Iterate over Queue with different approaches.
* @author javaguides.net
*
*/

public class IterateOverQueueExample {
    public static void main(String[] args) {
        Queue<String> elementsQueue = new LinkedList<>();

        elementsQueue.add("element1");
        elementsQueue.add("element2");
        elementsQueue.add("element3");
        elementsQueue.add("element4");

        System.out.println("=== Iterating over a Queue using Java 8 forEach() ===");
        elementsQueue.forEach(name -> {
            System.out.println(name);
        });

        System.out.println("\n=== Iterating over a Queue using iterator() ===");
        Iterator<String> elementQueueIterator = elementsQueue.iterator();
        while (elementQueueIterator.hasNext()) {
            String name = elementQueueIterator.next();
            System.out.println(name);
        }

        System.out.println("\n=== Iterating over a Queue using iterator() and Java 8 forEachRemaining() ===");
        elementQueueIterator = elementsQueue.iterator();
        elementQueueIterator.forEachRemaining(name -> {
            System.out.println(name);
        });

        System.out.println("\n=== Iterating over a Queue using simple for-each loop ===");
        for(String name: elementsQueue) {
            System.out.println(name);
        }
    }
}

输出。

=== Iterating over a Queue using Java 8 forEach() ===
element1
element2
element3
element4

=== Iterating over a Queue using iterator() ===
element1
element2
element3
element4

=== Iterating over a Queue using iterator() and Java 8 forEachRemaining() ===
element1
element2
element3
element4

=== Iterating over a Queue using simple for-each loop ===
element1
element2
element3
element4

相关文章