Java Queue队列使用入门详解

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(1711)   2023-03-28 11:29:14

一、什么是Queue?

队列是先进先出(FIFO)数据结构。它在现实生活中模拟队列(排队)。是的,你可能在电影院,购物中心,地铁或公共汽车前看到过的那个排队。

就像现实生活中的队列一样,队列数据结构中的新元素会添加到后面并从前面移除。可以显示队列,如下图所示。
就像现实生活中的队列一样,队列数据结构中的新元素会添加到后面并从前面移除。可以显示队列,如下图所示。

在Queue后面添加元素的过程称为Enqueue,从队列前面删除元素的过程称为Dequeue。

Java提供了一个Queue接口,它是Java集合框架的一部分。下图描述了集合层次结构中Queue接口的位置 -Java提供了一个Queue接口,它是Java集合框架的一部分。下图描述了集合层次结构中Queue接口的位置 -

Java中的Queue只是一个接口。我们需要在我们的程序中使用Queue接口的具体实现。

如上图所示,LinkedList类实现了Queue接口,因此可以用作Queue。

二、创建队列并执行Enqueue和Dequeue等基本操作

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

public class QueueExample {
    public static void main(String[] args) {
        // 使用LinkedList创建并初始化一个队列 
        Queue<String> waitingQueue = new LinkedList<>();

        //给队列添加元素(Enqueue 操作)
        waitingQueue.add("Rajeev");
        waitingQueue.add("Chris");
        waitingQueue.add("John");
        waitingQueue.add("Mark");
        waitingQueue.add("Steven");

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

        // 从队列中删除元素( Dequeue操作)
        // 使用remove()方法删除元素时候,如果队列是空的,会抛出NoSuchElementException异常
        String name = waitingQueue.remove();
        System.out.println("Removed from WaitingQueue : " + name + " | New WaitingQueue : " + waitingQueue);

        // 使用poll()方法删除队列中的元素 
        //poll()方法和remove()相似,唯一的区别是当队列为空时候poll()返回null
        name = waitingQueue.poll();
        System.out.println("Removed from WaitingQueue : " + name + " | New WaitingQueue : " + waitingQueue);
    }
}
输出:

WaitingQueue : [Rajeev, Chris, John, Mark, Steven]
Removed from WaitingQueue : Rajeev | New WaitingQueue : [Chris, John, Mark, Steven]
Removed from WaitingQueue : Chris | New WaitingQueue : [John, Mark, Steven]

三、队列内部其他方法操作

  • 检查队列是否为空。
  • 找到队列的大小。
  • 在队列中搜索元素。
  • 将元素放在队列的前面而不删除它。
import java.util.LinkedList;
import java.util.Queue;

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

        waitingQueue.add("Jennifer");
        waitingQueue.add("Angelina");
        waitingQueue.add("Johnny");
        waitingQueue.add("Sachin");

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

        //检查Queue 是否为空
        System.out.println("is waitingQueue empty? : " + waitingQueue.isEmpty());

        //获取Queue的大小
        System.out.println("Size of waitingQueue : " + waitingQueue.size());

        // 查找Queue中是否包含某个元素
        String name = "Johnny";
        if(waitingQueue.contains(name)) {
            System.out.println("WaitingQueue contains " + name);
        } else {
            System.out.println("Waiting Queue doesn't contain " + name);
        }

        //获得一个第一的元素,但是不删除该元素 使用element()方法
        // 当队列是空的时候element() 方法将会抛出 NoSuchElementException 异常
        String firstPersonInTheWaitingQueue =  waitingQueue.element();
        System.out.println("First Person in the Waiting Queue (element()) : " + firstPersonInTheWaitingQueue);

        //peek() 方法和 element() 相似,唯一区别是当队列为空时候peek()方法返回值为null
       
        firstPersonInTheWaitingQueue = waitingQueue.peek();
        System.out.println("First Person in the Waiting Queue : " + firstPersonInTheWaitingQueue);

    }
}
输出:
WaitingQueue : [Jennifer, Angelina, Johnny, Sachin]
is waitingQueue empty? : false
Size of waitingQueue : 4
WaitingQueue contains Johnny
First Person in the Waiting Queue (element()) : Jennifer
First Person in the Waiting Queue : Jennifer

四、在Java中迭代队列

本节中的示例显示了迭代队列的各种方法:

  • 使用Java 8 forEach()方法迭代队列。
  • 使用iterator()迭代队列。
  • 使用iterator()和Java 8 forEachRemaining()方法迭代队列。
  • 使用简单的for-each循环迭代队列。

队列中的迭代顺序与插入顺序相同。

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

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

        waitingQueue.add("John");
        waitingQueue.add("Brad");
        waitingQueue.add("Angelina");
        waitingQueue.add("Julia");

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

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

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

        System.out.println("\n=== Iterating over a Queue using simple for-each loop ===");
        for(String name: waitingQueue) {
            System.out.println(name);
        }
    }
}
输出:
=== Iterating over a Queue using Java 8 forEach() ===
John
Brad
Angelina
Julia

=== Iterating over a Queue using iterator() ===
John
Brad
Angelina
Julia

=== Iterating over a Queue using iterator() and Java 8 forEachRemaining() ===
John
Brad
Angelina
Julia

=== Iterating over a Queue using simple for-each loop ===
John
Brad
Angelina
Julia

五、总结

这就是所有!在本文中,您了解了什么是Queue数据结构,如何在Java中创建Queue,如何向Queue添加新元素,如何从Queue中删除元素以及如何在Queue中搜索元素。

标签: Queue Java 队列
地址:https://www.leftso.com/article/456.html

相关阅读

Java Queue队列使用入门详解
java Queue队列实现生产消费模式,什么是Java编程中的Queue(队列),手动实现生产者消费者模式
简述在本博客中,我们将会创建一个reids的消息队列,Redis可以被当成消息队列使用
LinkedBlockingQueue 阻塞队列实现生产/消费模型package com.example.demospringbootqueueasynctask; import org.sl...
Java编程中Spring Boot整合RabbitMQ实现消息中间件RabbitMQ的使用
spring boot整合activemq。本博客将通过一个简单的例子讲解在spring boot中activemq如何作为消费者(Consumer )和如何在spring boot中消息提供者...
Java MongoDB驱动程序,下载/升级,Java驱动程序兼容性,第三方框架和库
本文将讲述CLH锁的使用场景,什么情况适合使用CLH锁?Java 怎么使用CLH锁?
本文将讲述MCS锁的使用场景,什么情况适合使用MCS锁?Java 怎么使用MCS锁?