java 优先级

优先级
运算符
结合性
1
() [] .
从左到右
2
! +(正) -(负) ~ ++ --
从右向左
3
* / %
从左向右
4
+(加) -(减)
从左向右
5
<< >> >>>
从左向右
6
< <= > >= instanceof
从左向右
7
== !=
从左向右
8
&(按位与)
从左向右
9
^
从左向右
10
|
从左向右
11
&&
从左向右
12
||
从左向右
13
?:
从右向左
14
= += -= *= /= %= &= |= ^= ~= <<= >>= >>>=
从右向左
### Java优先级队列 `PriorityQueue` 的使用与实现 #### 1. 基础概念 Java 中的 `PriorityQueue` 是一种基于堆数据结构实现的数据容器,其内部维护了一个二叉堆来保证元素按优先级排序。默认情况下,`PriorityQueue` 实现的是最小堆(min-heap),即每次取出的都是当前队列中最小的元素[^3]。 #### 2. 创建 `PriorityQueue` 可以通过多种方式创建 `PriorityQueue` 对象: - **无参数构造函数** 使用默认初始容量和自然顺序创建一个空的优先级队列。 ```java PriorityQueue<Integer> pq = new PriorityQueue<>(); ``` - **指定初始容量** 可以为优先级队列设置初始容量以优化性能。 ```java PriorityQueue<Integer> pqWithCapacity = new PriorityQueue<>(20); ``` - **自定义比较器** 如果需要改变默认的排序规则,则可以传入一个自定义的比较器对象。 ```java PriorityQueue<Integer> pqWithComparator = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); // 改变成最大堆 } }); ``` 上述方法展示了如何通过不同的构造函数初始化 `PriorityQueue`[^1]。 #### 3. 主要操作方法 以下是 `PriorityQueue` 提供的一些常用方法及其功能说明: - **add(E e)** 或者 **offer(E e)**:向队列中插入新元素并调整堆结构使其保持有序状态。 - **poll()**:移除并返回队首元素(具有最高优先权的那个)。如果队列为空则返回 null。 - **peek()**:获取但不删除队首元素;若队列为空也返回 null。 - **size()** 和 **isEmpty()**:分别用于查询队列大小以及判断是否为空。 下面是一个简单的例子展示这些基本操作: ```java import java.util.PriorityQueue; public class Main { public static void main(String[] args) { PriorityQueue<String> priorityQueue = new PriorityQueue<>(); // 添加元素到队列 priorityQueue.add("Banana"); priorityQueue.offer("Apple"); System.out.println("Peek at the head element: " + priorityQueue.peek()); while (!priorityQueue.isEmpty()) { System.out.println(priorityQueue.poll()); // 输出 Apple -> Banana } } } ``` 此代码片段演示了如何向 `PriorityQueue` 插入字符串类型的项目,并查看它们被提取出来的顺序遵循字母表升序排列[^2]。 #### 4. 底层实现原理 `PriorityQueue` 内部采用数组形式存储节点,并维持完全二叉树特性以便快速定位父结点及子结点位置关系。每当有新的项加入或者已有顶点被弹出之后都会触发一次向上/向下筛选过程 (sift-up or sift-down),从而重新恢复整个集合满足堆属性的要求——对于每一个非叶子节点而言,它的键值都不大于(小于等于)任何一个后代节点的关键字值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值