iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java集合框架之PriorityQueue优先级队列实例分析
  • 650
分享到

Java集合框架之PriorityQueue优先级队列实例分析

2023-07-02 08:07:11 650人浏览 八月长安
摘要

这篇文章主要讲解了“Java集合框架之PriorityQueue优先级队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合框架之PriorityQueue优先级队列实例分析

这篇文章主要讲解了“Java集合框架之PriorityQueue优先级队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合框架之PriorityQueue优先级队列实例分析”吧!

Java集合框架之PriorityQueue优先级队列实例分析

Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue

priorityQueue在Java集合框架中的关系如下:
Java集合框架之PriorityQueue优先级队列实例分析

一、使用PriorityQueue的注意点

使用时必须导入PriorityQueue所在的包,即:

import java.util.PriorityQueue

PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出
ClassCastException异常

不能插入null对象,否则会抛出NullPointerException

没有容量限制,可以插入任意多个元素,其内部可以自动扩容

插入和删除元素的时间复杂度为log以2为底的n

PriorityQueue底层使用了堆数据结构

PriorityQueue默认情况下是小堆---即每次获取到的元素都是最小的元素(想要变成大堆,需要我们重新比较方法、默认的比较方法是Comparable接口中的compareTo方法)

二、PriorityQueue常用接口介绍

1. 优先级队列的构造

此处只是列出了PriorityQueue中常见的几种构造方式,其他的大家可以参考帮助文档。

构造器功能介绍
PriorityQueue()创建一个空的优先级队列,默认容量是11
PriorityQueue(int
initialCapacity)
创建一个初始容量为initialCapacity的优先级队列,注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异
PriorityQueue(Collection<?
extends E> c)
用一个集合来创建优先级队列
PriorityQueue(Comparator<? super E> comparator)创建具有默认初始容量的优先级队列,并根据指定的比较器对其元素进行比较
PriorityQueue(int initialCapacity, Comparator <? super E> comparator)

创建一个初始容量为initialCapacity的优先级队列,根据指定的比较器对其元素进行比较

注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异

2、PriorityQueue中对元素的比较

看完了构造方法,我们重新来思考一个问题

优先级队列是如何实现有序的呢?因为优先级队列就是借助小根堆来实现的

在实现小根堆的过程我们知道这其中一定发生了元素的比较,所以PriorityQueue中的元素必须要能够比较大小,那么PriorityQueue是如何进行元素的比较呢?

PriorityQueue采用了:
Comparble和Comparator两种方式。

Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接口,并覆写compareTo方法

用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现Comparator接口并覆写compare方法。

Java集合框架之PriorityQueue优先级队列实例分析

我们看到这里程序报错了,为什么呢?因为我们插入的Child对象是不可比较的(即没有实现Comparable接口又没有采用自定义的比较器)

可以看到

Java集合框架之PriorityQueue优先级队列实例分析

即我们采用了默认的比较方法Comparable接口中的compareTo方法

Java集合框架之PriorityQueue优先级队列实例分析

此时我们再次看一下报错信息

Java集合框架之PriorityQueue优先级队列实例分析看来是在往PriorityQueue中插入元素的时候出现了问题

那么我们打开PriorityQueue的源码看一下(下面是PriorityQueue中offer方法的源码)

Java集合框架之PriorityQueue优先级队列实例分析

再看看shiftUp的源码

Java集合框架之PriorityQueue优先级队列实例分析

继续点进去siftUpComparable

Java集合框架之PriorityQueue优先级队列实例分析

此时再回过头来看看我们放到PriorityQueue中的Child对象,他即没有自定义比较器又没有实现Comparable接口,当然报错呀!

那么好吧我们在Child类中实现Comparable接口,按年龄进行比较

import java.util.PriorityQueue;class Child implements Comparable<Child>{    int age;    String name;    public Child(int age, String name) {        this.age = age;        this.name = name;    }    @Override    public int compareTo(Child o) {        return this.age - o.age;  // 默认实现小根堆    }    @Override    public String toString() {        return "Child{" +                "age=" + age +                ", name='" + name + '\'' +                '}';    }}public class TestPriorityQueue {    public static void main(String[] args) {        PriorityQueue<Child> priorityQueue = new PriorityQueue<>();        priorityQueue.offer(new Child(12, "小亮"));        priorityQueue.offer(new Child(11, "小红"));        priorityQueue.offer(new Child(8, "小强"));        System.out.println(priorityQueue);    }}

Java集合框架之PriorityQueue优先级队列实例分析

如果要实现大根堆,也好办

Java集合框架之PriorityQueue优先级队列实例分析

上面我们是实现了Compable接口,那么如果我们自定义一个年龄比较器呢?

class Child {    int age;    String name;    public Child(int age, String name) {        this.age = age;        this.name = name;    }    @Override    public String toString() {        return "Child{" +                "age=" + age +                ", name='" + name + '\'' +                '}';    }}class AgeComparator implements Comparator<Child> {    @Override    public int compare(Child o1, Child o2) {        return o1.age - o2.age; // 实现小根堆        // return o2.ae - o1.age 实现大根堆    }}public class TestPriorityQueue {    public static void main(String[] args) {        AgeComparator ageComparator = new AgeComparator();        // 创建具有默认初始容量的 PriorityQueue ,并根据指定的比较器对其元素进行排序。        PriorityQueue<Child> priorityQueue = new PriorityQueue<>(ageComparator);        // 可以看到这里我的Child对象虽然没有实现Comparable接口,但因为我们对Child对象自定义了一个年龄比较器,所以插入元素不会报错        priorityQueue.offer(new Child(12, "小亮"));        priorityQueue.offer(new Child(11, "小红"));        priorityQueue.offer(new Child(8, "小强"));        System.out.println(priorityQueue);    }}

Java集合框架之PriorityQueue优先级队列实例分析

3、插入/删除/获取优先级最高的元素

函数名功能介绍
boolean
offer(E e)
插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常,时
间复杂度 ,注意:空间不够时候会进行扩容
E peek()获取优先级最高的元素,如果优先级队列为空,返回null
E poll()移除优先级最高的元素并返回,如果优先级队列为空,返回null
int size()获取有效元素的个数
void
clear()
清空

boolean

isEmty()

检测优先级队列是否为空,为空返回true

感谢各位的阅读,以上就是“Java集合框架之PriorityQueue优先级队列实例分析”的内容了,经过本文的学习后,相信大家对Java集合框架之PriorityQueue优先级队列实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java集合框架之PriorityQueue优先级队列实例分析

本文链接: https://www.lsjlt.com/news/340549.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java集合框架之PriorityQueue优先级队列实例分析
    这篇文章主要讲解了“Java集合框架之PriorityQueue优先级队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合框架之PriorityQueue优先级队列实例分析...
    99+
    2023-07-02
  • Java数据结构之优先级队列实例分析
    本文小编为大家详细介绍“Java数据结构之优先级队列实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java数据结构之优先级队列实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、堆的概念堆的定义:...
    99+
    2023-06-29
  • Java数据结构之优先级队列(PriorityQueue)用法详解
    目录概念PriorityQueue的使用小试牛刀(最小k个数) 堆的介绍优先级队列的模拟实现Top-k问题概念 优先级队列是一种先进先出(FIFO)的数据结构,与队列不同的...
    99+
    2024-04-02
  • JavaScript数据结构之优先队列与循环队列的示例分析
    这篇文章将为大家详细讲解有关JavaScript数据结构之优先队列与循环队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:优先队列实现一个优先队列:设...
    99+
    2024-04-02
  • Java集合框架概览之ArrayList源码分析
    今天小编给大家分享一下Java集合框架概览之ArrayList源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、从一...
    99+
    2023-07-05
  • Java线程优先级变量及功能实例分析
    这篇文章主要介绍“Java线程优先级变量及功能实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程优先级变量及功能实例分析”文章能帮助大家解决问题。前言:线程被称为“最小的处理单元”,...
    99+
    2023-07-02
  • Java Map 与其他集合框架的比较:优劣势分析与应用场景指南
    一、Map 集合框架概述 Map 集合框架是一种键值对数据结构,它允许您使用键来查找和存储值。Map 中的每个键都是唯一的,并且只能与一个值相关联。Map 集合框架中的常用实现包括 HashMap、TreeMap 和 LinkedHas...
    99+
    2024-02-09
    Map 集合框架 List Set HashMap TreeMap
  • Java集合类之组织结构和继承、实现关系的示例分析
    这篇文章主要为大家展示了“Java集合类之组织结构和继承、实现关系的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java集合类之组织结构和继承、实现关系的示例分析”这篇文章吧。Coll...
    99+
    2023-05-30
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作