亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java PriorityQueue 详解:基础、操作与自定义排序

Java PriorityQueue

通过清晰示例与最佳实践,探索 Java 集合框架中 PriorityQueue 类的用法。

PriorityQueue 类实现了堆数据结构,实现 Queue 接口,能根据优先级而非插入顺序高效获取元素。

Java PriorityQueue 详解:基础、操作与自定义排序

与普通队列不同,元素按排序顺序返回。若需升序,队头为最小元素;每次移除得到下一个最小值。注意内部顺序不保证,仅出队顺序有序。


创建 PriorityQueue

先导入 java.util.PriorityQueue:

import java.util.PriorityQueue;
PriorityQueue<Integer> numbers = new PriorityQueue<>();

默认使用自然顺序(升序)。可通过构造器传入 Comparator 自定义顺序。


PriorityQueue 的关键方法

包含 Queue 接口所有方法,外加少量队列专用操作。


插入元素

示例:

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        System.out.println("PriorityQueue: " + numbers);
        numbers.offer(1);
        System.out.println("更新后的 PriorityQueue: " + numbers);
    }
}

输出

PriorityQueue: [2, 4]
更新后的 PriorityQueue: [1, 4, 2]

尽管 4 先于 2 加入,但队头仍为 2(最小)。加入 1 后,1 成为新队头。


访问元素

用 peek() 查看队头而不移除:

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);
        int number = numbers.peek();
        System.out.println("访问的元素: " + number);
    }
}

输出

PriorityQueue: [1, 4, 2]
访问的元素: 1

移除元素

示例:

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);
        boolean result = numbers.remove(2);
        System.out.println("元素 2 是否移除? " + result);
        int number = numbers.poll();
        System.out.println("poll() 移除的元素: " + number);
    }
}

输出

PriorityQueue: [1, 4, 2]
元素 2 是否移除? true
poll() 移除的元素: 1

遍历 PriorityQueue

使用 iterator()(需 java.util.Iterator):

import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.print("PriorityQueue 遍历: ");
        Iterator<Integer> iterate = numbers.iterator();
        while (iterate.hasNext()) {
            System.out.print(iterate.next() + ", ");
        }
    }
}

输出

PriorityQueue 遍历: 1, 4, 2,

其他常用方法

方法说明
contains(element)判断元素是否存在
size()返回元素数量
toArray()转换为数组

使用 Comparator 自定义排序

为实现逆序或任意优先级,构造队列时传入 Comparator:

import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        numbers.add(3);
        System.out.print("PriorityQueue: " + numbers);
    }
}
class CustomComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer a, Integer b) {
        return b.compareTo(a); // 逆序
    }
}

输出

PriorityQueue: [4, 3, 1, 2]

自定义比较器使队头成为最大元素。更多细节请参考 Java Comparator API。


java

  1. 精通 Java 运算符:类型、语法与实战示例
  2. Java 注释:类型、用法与最佳实践
  3. 精通 Java if…else:控制流全解析
  4. 精通 Java 增强 for 循环:语法、示例与最佳实践
  5. Java break 语句:用法、时机与标签 break 详解
  6. 精通 Java 字符串:创建、方法与最佳实践
  7. 精通 Java 接口:概念、实现与最佳实践
  8. 精通 Java 匿名内部类:定义、语法与实战示例
  9. 精通 Java Try-With-Resources:自动资源管理详解
  10. Java 注解详解:类型、放置位置与实战示例
  11. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  12. 深入理解 Java Vector:用法、特性及与 ArrayList 的对比