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