关于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的原码, 在添加的时候有也是有排序的, 但是不是完全的排序, 只是负责把需要放到头部的元素保证一定在头部就行了
  • 然后删除在调用删除元素一次方法后, 也进行一次元素的排序, 而且也是不完全进行排序的, 也是保证头元素时对的的情况.

你可能感兴趣的:(java,java基础)