当前位置: 首页 > news >正文

Java 数据结构 优先级队列(堆)

目录

常用方法

常⽤接⼝介绍


常用方法

常⽤接⼝介绍

于PriorityQueue的使⽤要注意

1. PriorityQueue中放置的元素必须要能够⽐较⼤⼩,不能插⼊⽆法⽐较⼤⼩的对象,否则会抛出 ClassCastException异常

2. 不能插⼊null对象,否则会抛出NullPointerException

3. 没有容量限制,可以插⼊任意多个元素,其内部可以⾃动扩容

4. 插⼊和删除元素的时间复杂度为

5. PriorityQueue底层使⽤了堆数据结构

6. PriorityQueue默认情况下是⼩堆---即每次获取到的元素都是最⼩的元素

优先级队列的构造

// 创建⼀个空的优先级队列,底层默认容量是11 PriorityQueue<Integer> q1 = new PriorityQueue<>(); // 创建⼀个空的优先级队列,底层的容量为initialCapacity PriorityQueue<Integer> q2 = new PriorityQueue<>(100); // // list中已经包含了三个元素 PriorityQueue<Integer> q3 = new PriorityQueue<>(list);

三种构造方法的底层调用

public PriorityQueue() { this(DEFAULT_INITIAL_CAPACITY, null); } //this调用 public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) { // Note: This restriction of at least one is not actually needed, // but continues for 1.5 compatibility if (initialCapacity < 1) throw new IllegalArgumentException(); this.queue = new Object[initialCapacity]; this.comparator = comparator; }

插入元素的底层调用

注意offer调用,siftUp调用,siftUpComparable调用

q1.offer(10); // public boolean offer(E e) { if (e == null) throw new NullPointerException(); modCount++; int i = size; if (i >= queue.length) grow(i + 1); siftUp(i, e); size = i + 1; return true; } // siftUp的底层调用 private void siftUp(int k, E x) { if (comparator != null) siftUpUsingComparator(k, x, queue, comparator); else siftUpComparable(k, x, queue); } // siftUpComparable的底层调用 private static <T> void siftUpComparable(int k, T x, Object[] es) { //强转至<>中的类型 Comparable<? super T> key = (Comparable<? super T>) x; while (k > 0) { int parent = (k - 1) >>> 1; Object e = es[parent]; if (key.compareTo((T) e) >= 0) break; es[k] = e; k = parent; } es[k] = key; }

注意:默认情况下,PriorityQueue队列是⼩堆,如果需要⼤堆需要⽤⼾提供⽐较器

// ⽤⼾⾃⼰定义的⽐较器:直接实现Comparator接⼝,然后重写该接⼝中的 compare⽅法即可 // class IntCmp implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { return o2-o1; } } public class TestPriorityQueue { public static void main(String[] args) { PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp()); p.offer(4); p.offer(3); p.offer(2); p.offer(1); p.offer(5); System.out.println(p.peek()); } }
http://www.jsqmd.com/news/1270430/

相关文章:

  • 2026年7月北京市移动300M融合宽带攻略与避坑指南 - 找卡家园
  • C语言文件操作全指南:文件读写、随机访问与缓冲区机制
  • 2026华为OD面试题042:MVP争夺战
  • 2026年7月福建高中全日制一对一优质辅导机构推荐 - 互联网科技品牌测评
  • 终极同花顺问财数据采集方案:pywencai让金融数据获取变得简单高效
  • 【C++】封装红黑树实现mymap和myset(源码及框架分析、实现复用红黑树的框架,并支持insert、支持iterator迭代器的实现、map支持[]下标运算符、map和set代码实现)
  • UEFITool 0.28 终极指南:轻松解析和修改UEFI固件镜像
  • 2026合肥购宠终极测评|明轩猫犬舍3000㎡CKU认证繁育基地!江淮梅雨湿冷养宠避雷+选宠+养护全攻略 - 同城大型猫犬舍
  • 中国细瓷市场现状调查分析及未来竞争态势预测报告2026年版
  • 推荐系统多任务建模:架构设计与工程实践
  • 2026年7月北京市移动500M融合宽带安装流程 - 找卡家园
  • 2026 年当下,仙游优秀的二手托盘交易供货厂家哪家强,揭秘:别再扔掉你的旧托盘了!-易辰重型设备包装 - 企业推荐官【认证官方】
  • 2026年7月湖南省郴州市电信300M单宽带攻略与避坑指南 - 找卡家园
  • Linux PipeWire深度解析之pw_context_load_module调用流程与实战(二十八)
  • 877元/克高位运行:延边黄金回收市场的价格机制与合规渠道研究 - 资讯报道
  • 2026年7月湖南省湘潭市电信300M单宽带怎么安装? - 找卡家园
  • Android View 基础:工控触控界面布局、横竖屏锁定、适配工业屏分辨率
  • AM/DM37x与WL1271-TiWi无线方案:从硬件集成到驱动优化的嵌入式开发实战
  • SDR++终极指南:如何用这款开源软件定义无线电工具改变频谱监测体验
  • TI CC13x2/CC26x2载波侦听(CSMA)原理与实战:从RSSI/相关器到低功耗设计
  • 2026年7月湖南省娄底市移动单宽带办理避坑攻略,实测分享 - 找卡家园
  • 2026年7月金价走势参考,奢二网门店实时更新报价 - 大牌深度测评
  • 2026年7月湖南省衡阳市电信300M单宽带套餐避坑全攻略 - 找卡家园
  • 深度学习中的Affine与Softmax层实现与优化
  • UE5 C++开发避坑指南:USTRUCT、UENUM与ExposeOnSpawn的正确使用
  • CNN与Transformer混合模型在AI艺术鉴别中的应用
  • 灰狼优化算法与深度学习融合的时间序列预测实践
  • 中层领导必备的七种能力
  • Windows内核驱动开发中的设备节点与资源管理机制
  • 2026天津离婚律师怎么选?实战经验与专业口碑兼备的王增强律师团队 - 本地品牌推荐