java队列之queue用法实例分析

yizhihongxing

Java队列之Queue用法实例分析

什么是队列?

队列是一种特殊的线性数据结构,按照先进先出(First In First Out,FIFO)的原则存储数据,在队列的一端添加数据,在另一端删除数据,有点像排队买东西,先来的先买,后来的后买。

在Java中,队列的实现方式是使用Queue接口,Queue是Java中表示队列的接口,它继承了Collection接口,并在这个基础上添加了一些额外方法。

Queue的特性

  1. 元素只能在队尾添加,只能在队首删除。
  2. Queue只允许youpeek操作(查询队头元素),而不允许遍历整个队列。
  3. 支持同步,可以作为多线程环境中的任务队列使用。

如何使用Queue?

  1. 创建一个Queue实例,可以使用Java中已经实现的类LinkedList作为队列。
Queue<String> queue=new LinkedList<>();
  1. 添加元素:
queue.offer("a");  // 添加元素a
queue.offer("b");  // 添加元素b
queue.offer("c");  // 添加元素c
  1. 删除元素:
queue.poll();  // 删除队头元素a
  1. 查询元素:
queue.peek();  // 查询队头元素,返回b

示例说明

示例1:使用Queue求解迷宫问题

队列可以很方便地求解迷宫问题。我们可以将每一个位置看作一个节点,将节点放入队列中,并进行遍历找出终点。

public static void bfs(int[][] maze, int startX, int startY, int endX, int endY) {
    Queue<Point> queue = new LinkedList<>();
    queue.offer(new Point(startX, startY, null));
    Set<Point> visited = new HashSet<>();
    while (!queue.isEmpty()) {
        Point point = queue.poll();
        if (point.x == endX && point.y == endY) {
            printPath(point);
            return;
        }
        visited.add(point);
        for (Point next : getNexts(maze, point)) {
            if (!visited.contains(next)) {
                queue.offer(next);
            }
        }
    }
}

示例2:使用Queue实现线程池

线程池可以通过阻塞队列实现。当线程池中所有线程都在执行任务时,新任务需要等待,此时新任务可以被添加到阻塞队列中,等待有空闲的线程执行。

public class ThreadPool {
    private int coreSize;
    private int maxSize;
    private BlockingQueue<Runnable> queue;

    public ThreadPool(int coreSize, int maxSize, int queueSize) {
        this.coreSize = coreSize;
        this.maxSize = maxSize;
        this.queue = new ArrayBlockingQueue<>(queueSize);
        init();
    }

    private void init() {
        for (int i = 0; i < coreSize; i++) {
            new Thread(() -> {
                while (true) {
                    try {
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        break;
                    }
                }
            }).start();
        }
    }

    public void submit(Runnable task) throws InterruptedException {
        if (queue.size() == maxSize) {
            throw new RuntimeException("queue is full");
        }
        queue.put(task);
    }
}

以上示例仅为Queue使用的两个简单的例子,Queue在实际应用中有着更加广泛和深入的应用场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java队列之queue用法实例分析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • fetchtype.lazy优缺点

    fetchtype.lazy优缺点 什么是fetchtype.lazy 在JPA的@OneToMany和@ManyToMany注解中,有一个属性叫做fetch,用于指定数据的加载方式。其中,fetchtype.lazy表示懒加载方式,以延迟加载数据为代价,从而提高程序的性能。 优点 节省时间和资源 懒加载可以延迟加载数据,只有在需要时才会去加载数据,这样可以…

    其他 2023年3月28日
    00
  • 自动输出类的字段值实用代码分享

    标题:自动输出类的字段值实用代码分享 介绍 本篇文章将详细讲解如何使用 Python 代码自动输出类的字段值,这对于数据处理和分析非常实用。通过本文的分享,读者可以掌握如何使用 Python 代码遍历类的所有字段,并将其输出保存。 准备 在开始本篇文章的实现之前,需要先安装 Python 的相关依赖库,如 pandas 及 openpyxl: pip ins…

    other 2023年6月26日
    00
  • Java8通过Function获取字段名的步骤

    获取Java对象的字段名是一个常见需求,Java8通过java.util.function.Function接口提供了一个非常简便的实现方式。 首先,我们需要定义一个接受一个对象作为输入,并返回一个指定类型的结果的函数。这个函数可以使用Java8提供的Function<T, R>接口来定义。 其次,我们需要借助Java8提供的反射机制获取指定字段…

    other 2023年6月25日
    00
  • 跟我学习javascript的作用域与作用域链

    学习JavaScript的作用域与作用域链攻略 1. 什么是作用域? 作用域是指在程序中定义变量的区域,它决定了变量的可见性和生命周期。在JavaScript中,作用域可以分为全局作用域和局部作用域。 全局作用域:在整个程序中都可以访问的变量被称为全局变量,它们在程序开始执行时创建,在程序结束时销毁。 局部作用域:在函数内部定义的变量被称为局部变量,它们只能…

    other 2023年8月19日
    00
  • 数据降维-lda线性降维

    数据降维-lda线性降维 数据降维是机器学习中非常重要的一个主题,主要是为了通过减少特征属性数量来降低复杂性和提高性能。常常使用的降维方法有主成分分析(PCA)和线性判别分析(LDA)。本文主要介绍LDA线性降维方法。 背景知识 在进行机器学习任务时,我们往往需要面对高维数据的挑战。比如说,在一个图像分类任务中,每一张图像可能有数千个像素点,每个像素点又有三…

    其他 2023年3月28日
    00
  • oracle中的trim()函数详解

    以下是“Oracle中的TRIM()函数详解”的完整攻略: Oracle中的TRIM()函数详解 TRIM()函数是Oracle SQL中的一个字符串函数,它用于删除字符串的开头和结尾的空格或指定的字符。本攻略将介绍TRIM()的语法、用法和示例。 语法 TRIM()函数的语法如下: TR([LEADING | TRAILING | BOTH] [trim_…

    other 2023年5月7日
    00
  • C语言数组超详细讲解上

    C语言数组超详细讲解 概述 C语言中的数组是一种数据结构,可以用于存储一组相同的数据类型。数组可以容纳大量数据,可以通过下标来访问数组中的特定元素。数组在程序中的应用非常广泛,特别是在处理大量数据和进行数值计算的时候。 创建数组 要创建数组,首先需要定义数组的长度和数据类型。数组的长度表示数组可以容纳多少个元素,数据类型表示这些元素的类型。例如,下面的代码定…

    other 2023年6月25日
    00
  • 易语言创建大漠模块及免注册调用大漠

    以下是关于“易语言创建大漠模块及免注册调用大漠”的完整攻略,包含两个示例。 易语言创建大漠模块及免注册调用大漠 大漠插件是一款常用的自动化工具,可以帮助开发人员实现自动化操作。在易语言中,我们可以通过创建大漠模块来调用大漠插件。下面我们将介绍如何大漠模块和免注册调用大漠。 1. 创建大漠模块 以下是一个使用易语言创建大漠模块的示例: 打开易语言,创建一个新的…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部