关于PriorityQueue队列排序问题

  • java版本1.8
发现问题, 发现PriorityQueue的排序居然没有任何效果, 程序如下
public class MainTest {
    public static void main(String[] args) {

        PriorityQueue<Integer> tasks  = new PriorityQueue<>(
                (a, b) -> a.compareTo(b)
        );
        tasks.offer(1);
        tasks.offer(3);
        tasks.offer(2);
        tasks.offer(6);
        tasks.offer(4);

        for (Integer task : tasks) {
            System.out.println(task);
        }
    }
}
  • 以上代码输出
1
3
2
6
4
  • 然后我们对比了下使用TreeSet实现的方式, 代码如下
 TreeSet<Integer> values = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });

        values.add(1);
        values.add(3);
        values.add(2);
        values.add(6);
        values.add(4);

        for (Integer value : values) {
            System.out.println(value);
        }

  • 输出内容为
1
2
3
4
6
  • 这让我百思不得其解, 难道这是一个bug, jdk怎么会出现如此低级的bug呢, 所以楼主又研究, 然后发现, 使用队列中的remove()方法拿出的元素就是正常顺序的, 代码如下
public class MainTest {
    public static void main(String[] args) {

        PriorityQueue<Integer> tasks  = new PriorityQueue<>(
                (a, b) -> a.compareTo(b)
        );
        tasks.offer(1);
        tasks.offer(3);
        tasks.offer(2);
        tasks.offer(6);
        tasks.offer(4);

        while (tasks.size()!= 0){
            System.out.println(tasks.remove());
        }
    }
}
  • 代码完毕, 输出正常如下
1
2
3
4
6
  • 之后我研究了下jdk的原码, 在添加的时候有也是有排序的, 但是不是完全的排序, 只是负责把需要放到头部的元素保证一定在头部就行了
  • 然后删除在调用删除元素一次方法后, 也进行一次元素的排序, 而且也是不完全进行排序的, 也是保证头元素是对的的情况.
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PriorityQueue类有两种排序构造器。第一种是使用Comparator函数方法进行排序的构造器,它接受一个Comparator对象作为参数。这个Comparator对象用来定义元素的排序规则。例如,可以通过传入一个自定义的Comparator对象来实现降序排序。构造方法的声明如下:`public PriorityQueue(Comparator<? super E> comparator)`。\[2\] 第二种是无参构造器,它使用默认的升序排序规则。在这种情况下,PriorityQueue会根据元素的自然顺序进行排序。如果元素是基本类型,它们会按照数值大小进行排序。如果元素是自定义类对象,需要确保该类实现了Comparable接口,并重写了compareTo()方法来定义元素的自然顺序。构造方法的声明如下:`public PriorityQueue()`。\[2\] 通过使用这两种构造器,可以根据需要来创建不同排序规则的PriorityQueue对象。 #### 引用[.reference_title] - *1* *3* [【Java集合框架】09 ——PriorityQueue 类](https://blog.csdn.net/weixin_44735928/article/details/126112445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java PriorityQueue优先排序队列](https://blog.csdn.net/weixin_43704834/article/details/122185871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值