c语言编程笔录

首页 >   > 笔记大全

笔记大全

深入浅析JDK中的PriorityQueue

更新时间:2023-10-25

什么是PriorityQueue

PriorityQueue是Java集合框架中的一种实现,它表示一个有优先级的元素队列。通常来说,元素按照其的优先级从低到高的顺序排列。默认情况下,PriorityQueue中元素的顺序是根据元素的自然顺序来排列的。然而,我们可以自定义比较器来改变元素比较的顺序。PriorityQueue通常用于需要根据优先级按顺序处理元素的场景,如任务调度和事件处理。


    //创建PriorityQueue
    Queue<Integer> pq = new PriorityQueue<>();
    //添加元素
    pq.offer(4);
    pq.offer(1);
    pq.offer(2);
    //输出元素
    while(!pq.isEmpty()) {
        System.out.println(pq.poll());
    }

    //输出
    //1
    //2
    //4

元素的比较和排序

在PriorityQueue中,元素的比较和排序是通过元素自身的compareTo()方法来完成的。如果元素没有实现Comparable接口,则可以通过提供一个Comparator来实现元素的比较和排序。在使用Comparator实现元素比较时,需要在创建PriorityQueue时将Comparator传递给它的构造函数。


    //创建一个比较器
    Comparator<String> comparator = new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.length() - s2.length();
        }
    };
    //创建PriorityQueue,传入比较器
    Queue<String> pq = new PriorityQueue<>(comparator);
    //添加元素
    pq.offer("aaa");
    pq.offer("bb");
    pq.offer("c");
    //输出元素
    while(!pq.isEmpty()) {
        System.out.println(pq.poll());
    }

    //输出
    //c
    //bb
    //aaa

线程安全

PriorityQueue不是线程安全的。如果多个线程同时修改PriorityQueue,可能导致元素顺序不正确或者元素丢失。如果需要在多线程环境下使用PriorityQueue,可以通过使用线程安全的包装类来实现。


    //创建线程安全的PriorityQueue
    Queue<Integer> pq = new PriorityBlockingQueue<>();

总结

PriorityQueue是一个非常有用的集合,它可以在需要根据优先级按顺序处理元素的场景中发挥重要作用。我们可以通过元素的自然顺序或者自定义比较器来控制元素之间的比较和排序。如果需要在多线程环境中使用PriorityQueue,可以使用线程安全的包装类。