JAVA:常用的队列指南

news2024/12/26 22:59:59

1、简述

在计算机科学中,队列是一种常见的线性数据结构,它遵循先进先出(FIFO,First In First Out)的原则。队列在各种应用中广泛使用,例如任务调度、消息队列和宽度优先搜索等。在 Java 中,队列是 java.util 包的一部分,并且 Java 提供了多种类型的队列以满足不同的需求。本文将详细介绍不同类型的队列及其使用示例。
在这里插入图片描述

2、基本队列接口

在 Java 中,队列由 Queue 接口表示。这个接口定义了一些基本的队列操作,例如插入、删除和检查元素。

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

public class BasicQueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();

        // 插入元素
        queue.add(1);
        queue.add(2);
        queue.add(3);

        // 检查队列头部元素
        System.out.println("队列头部元素: " + queue.peek());

        // 删除元素
        System.out.println("移除的元素: " + queue.poll());

        // 打印队列元素
        System.out.println("队列元素: " + queue);
    }
}

3、常见的队列实现

3.1 链表队列(LinkedList)

LinkedList 类实现了 Queue 接口。它是一个双向链表,因此可以在常数时间内添加和删除元素。

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

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

        queue.add("A");
        queue.add("B");
        queue.add("C");

        System.out.println("LinkedList队列: " + queue);
        System.out.println("移除元素: " + queue.poll());
        System.out.println("LinkedList队列: " + queue);
    }
}
3.2 优先队列(PriorityQueue)

PriorityQueue 是一个基于优先级堆实现的队列。它不保证元素的顺序,而是根据元素的自然顺序或提供的比较器来排序。

import java.util.PriorityQueue;
import java.util.Queue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        Queue<Integer> priorityQueue = new PriorityQueue<>();

        priorityQueue.add(5);
        priorityQueue.add(1);
        priorityQueue.add(3);

        System.out.println("PriorityQueue队列: " + priorityQueue);
        System.out.println("移除元素: " + priorityQueue.poll());
        System.out.println("PriorityQueue队列: " + priorityQueue);
    }
}
3.3 阻塞队列(BlockingQueue)

BlockingQueue 是一个线程安全的队列,支持阻塞插入和删除操作。常见的实现有 ArrayBlockingQueue、LinkedBlockingQueue 和 PriorityBlockingQueue。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);

        blockingQueue.put("X");
        blockingQueue.put("Y");
        blockingQueue.put("Z");

        System.out.println("BlockingQueue队列: " + blockingQueue);
             System.out.println("移除元素: " + blockingQueue.take());
        System.out.println("BlockingQueue队列: " + blockingQueue);
    }
}
3.4 双端队列(Deque)

Deque(Double Ended Queue)是一个可以从两端插入和移除元素的队列。常见的实现有 LinkedList 和 ArrayDeque。

import java.util.Deque;
import java.util.LinkedList;

public class DequeExample {
    public static void main(String[] args) {
        Deque<String> deque = new LinkedList<>();

        deque.addFirst("A");
        deque.addLast("B");
        deque.addFirst("C");

        System.out.println("Deque队列: " + deque);
        System.out.println("移除头部元素: " + deque.pollFirst());
        System.out.println("移除尾部元素: " + deque.pollLast());
        System.out.println("Deque队列: " + deque);
    }
}

4、队列的实际应用

4.1 任务调度器

队列在任务调度器中非常有用,可以用于管理任务的执行顺序。下面是一个简单的任务调度器示例:

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

class Task {
    private String name;

    public Task(String name) {
        this.name = name;
    }

    public void execute() {
        System.out.println("执行任务: " + name);
    }
}

public class TaskScheduler {
    private Queue<Task> taskQueue;

    public TaskScheduler() {
        taskQueue = new LinkedList<>();
    }

    public void addTask(Task task) {
        taskQueue.add(task);
    }

    public void executeTasks() {
        while (!taskQueue.isEmpty()) {
            Task task = taskQueue.poll();
            task.execute();
        }
    }

    public static void main(String[] args) {
        TaskScheduler scheduler = new TaskScheduler();
        scheduler.addTask(new Task("任务1"));
        scheduler.addTask(new Task("任务2"));
        scheduler.addTask(new Task("任务3"));

        scheduler.executeTasks();
    }
}
4.2 消息队列

消息队列用于在分布式系统中传递消息。以下是一个使用 BlockingQueue 实现的简单消息队列示例:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

class Producer implements Runnable {
    private BlockingQueue<String> queue;

    public Producer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            queue.put("消息1");
            System.out.println("生产者发送: 消息1");
            Thread.sleep(1000);
            queue.put("消息2");
            System.out.println("生产者发送: 消息2");
            Thread.sleep(1000);
            queue.put("消息3");
            System.out.println("生产者发送: 消息3");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

class Consumer implements Runnable {
    private BlockingQueue<String> queue;

    public Consumer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                String message = queue.take();
                System.out.println("消费者接收: " + message);
                Thread.sleep(2000);
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

public class MessageQueueExample {
    public static void main(String[] args) {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);

        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);

        new Thread(producer).start();
        new Thread(consumer).start();
    }
}

5、总结

本文介绍了 Java 中几种常见的队列实现,包括链表队列、优先队列、阻塞队列和双端队列。每种队列都有其独特的特性和应用场景。通过这些示例代码,希望您能更好地理解和使用 Java 队列来解决实际问题。如果您有任何问题或建议,欢迎在评论区交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android perfetto使用技巧梳理

1 抓取方法 根据不同的配置参数&#xff0c;会显示不同的功能。 比如有的trace文件就无法显示线程状态信息&#xff0c;有的无法显示锁依赖信息等等&#xff0c;要看你的参数&#xff0c;我这个是很全的&#xff0c;基本够了&#xff0c;如果还想添加&#xff0c;可以命令行看…

我与OceanBase|一位DBA老兵的国产数据库探索之旅

本文作者&#xff1a;尚雷&#xff0c;有超过十年的工作经验&#xff0c;目前就职于南京一家上市互联网企业&#xff0c;担任DBA。Oracle 11g OCM&#xff0c;Oracle及PG的 ACE认证&#xff0c;并有AWS及国产知名数据库等多项认证。他热衷于技术交流与分享&#xff0c;爱交友&a…

Apache AGE 安装部署

AGE概述 概述 我们可以通过源码安装、拉取docker镜像运行、直接使用公有云三种方式中的任意一种来使用Apache AGE 获取 AGE 发布版本 可以在 https://github.com/apache/age/releases 找到发布版本和发布说明。 源代码 源代码可以在 https://github.com/apache/age 找到…

非参数检测5——双输入检测系统

在很多情况下&#xff0c;信号常常存在于两个带有独立噪声的信道中。所以很有必要研究双输入系统。双输入系统广泛应用于无线电天文学、水下声波检测和地球物理学等领域。

【ffmpeg系列一】源码构建,ubuntu22与win10下的过程对比。

文章目录 背景ubuntu22结论 win10过程 对比结论 背景 顺手编译个ffmpeg试试&#xff0c;看看不同平台下谁的配置比较繁琐。 先让gpt给出个教程&#xff1a; ubuntu22 使用elementary-os7.1构建&#xff0c;看看有几个坑要踩。 错误1&#xff1a; 依赖libavresample-dev未…

源码层面学习动态代理

前言 在Java中&#xff0c;动态代理主要分为CGLIB动态代理和JDK动态代理&#xff0c;我们从Hutool的源码也可一窥这两者的使用方式和区别&#xff1b; CGLIB动态代理 JDK动态代理 使用场景 CglibInterceptor和JdkInterceptor都是Hutool提供的代理工具&#xff0c;用于在运行时…

214.贪心算法:K次取反后最大化的数组和(力扣)

class Solution { public:int largestSumAfterKNegations(vector<int>& nums, int k) {int sum 0;// 进行k次取反操作while (k > 0){// 对数组进行排序sort(nums.begin(), nums.end());// 将最小的元素取反nums[0] -nums[0];// 减少k的值k--;}// 计算数组的总和…

12 - matlab m_map地学绘图工具基础函数 - 在地图上绘制矢量场m_vec函数和绘制风羽图的m_windbarb函数

12 - matlab m_map地学绘图工具基础函数 - 在地图上绘制矢量场函数m_vec和绘制风羽图的函数m_windbarb 0. 引言1. 关于m_vec2. 关于m_windbarb3. 总结 0. 引言 本篇介绍下m_map中绘制矢量场的函数&#xff08;m_vec&#xff09;和地图上绘制风羽图的函数m_windbarb。 1. 关于m…

语言模型的进化:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

Unity扩展 Text支持超链接文本

重点提示&#xff1a;当前的文本扩展支持多个超链接&#xff0c;支持修改超链接规则和支持修改超链接颜色。 近期在邮件文本中用到了超链接。最初是在邮件窗口中新加一个按钮用来超链接跳转&#xff0c;之后发现效果表现不如直接在文本中添加&#xff0c;后经过几个小时的资料…

STM32中的DMA:解锁高效数据传输的秘密武器(内附实例)

目录 引言 理解DMA&#xff1a;数据的高效搬运工 DMA的主要特性 多优先级请求 事件标志 数据对齐 多样化的数据传输路径 广泛的数据源与目标 最大数据长度 DMA寄存器详解 增量与循环模式 DMA中断机制 ​编辑 小实验&#xff1a;DMA-ADC串口发送 引言 在现代嵌入…

SpringCloudAlibaba基础五 Nacos配置中心

一 Nacos配置中心介绍 官方文档&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos C…

集成sa-token前后端分离部署配置corsFliter解决跨域失效的真正原因

文章目录 1.前言2.问题复现3.解决方法3.1 方式一&#xff1a;后端修改CorsFilter源码3.2 方式二&#xff1a;前端禁用或移除浏览器referrer-policy引用者策略 4.总结 1.前言 缘由请参看下面这篇文章&#xff1a;sa-token前后端分离解决跨域的正确姿势 https://mp.weixin.qq.co…

气象观测站应该怎么选?

在气候变化日益严峻的今天&#xff0c;气象观测站的重要性不言而喻。它们不仅为气象部门提供宝贵的数据支持&#xff0c;还直接关系到农业生产、交通运输、城市规划等多个领域的决策。 在选择气象观测站时&#xff0c;首先要明确自己的功能需求。例如&#xff0c;是用于学术研究…

每日一练全新考试模式解锁|考试升级

&#x1f64b;频繁有小伙伴咨询&#xff1a;我想举办一场历时一个月的答题活动&#xff0c;学生可以每天打开答题&#xff0c;活动完结后可以导出每天的答题成绩 此前我们都会让小伙伴创建30场考试&#xff0c;然后使用批量分享功能组合起来&#xff0c;对外分享一个链接就可以…

类与对象2 3 十十一 杂烩

目录 组合类 作用域 static friend 常对象常成员函数 常引用 对象指针&#xff08;指向对象&#xff09; string 组合类 类的组合/聚合&#xff1a;将已有的类的对象作为新的类的成员。 组合类初始化&#xff1a;内嵌对象成员初始化 普通数据成员初始化。 类必须先…

24下软考《系统规划与管理师》,一个超好背的核心知识点几页纸!

距离下半年软考考试的时间越来越近了&#xff0c;想要备考《系统规划与管理师》的小伙伴们趁着这两周赶紧准备起来&#xff0c;虽说系规相对较好考&#xff0c;但作为高级科目&#xff0c;它要记得东西还是不少的。 今天给大家整理了——系统规划与管理师考前几页纸&#xff0c…

C++语言相关的常见面试题目(二)

1.vector底层实现原理 以下是 std::vector 的一般底层实现原理&#xff1a; 内存分配&#xff1a;当创建一个 std::vector 对象时&#xff0c;会分配一块初始大小的连续内存空间来存储元素。这个大小通常会随着 push_back() 操作而动态增加。 容量和大小&#xff1a;std::vec…

多卡(3090)部署通义千问Qwen2-72B大模型并加速至38tps:vLLM库的使用和错误排查

前一篇文章做了Qwen1的加速&#xff0c;其中关于Auto-GPTQ的安装问题在Qwen2中依然适用。但是Qwen2比Qwen1加载模型快了很多&#xff0c;笔者也不知道为什么。 下面是Hugging Face transformer版的千问2&#xff0c;token生成速度在15个每秒左右&#xff0c;但还不够快&#x…

Spring——IOC创建对象方式

可参考官网&#xff1a;https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.htmlhttps://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html 1. 使用无参构造创建对象&#xff0…