PriorityQueue有一个特征需要特别注意,即:对于那些通过排序方法判定为“相等”的元素,在通过poll方法依次取出它们时,它们的顺序是不确定的,特别是不会维持插入的顺序。举例说明:假如一个对象Obj,有a,b两个字段,如果Obj对象是按字段a由小到大进行排序的,当向队列依次插入a,b分别为:(1,1),(2,1),(1,2),(2,2),(1,3)的五个元素时,通过poll方法从队头依次取出的元素会是什么呢?首先,一定可以确定的是(1,1),(1,2),(1,3)一定会排在前面,(2,1),(2,2)一定会排在后面,问题在于(1,1),(1,2),(1,3)之间和(2,1),(2,2)之间是如果排序的,习惯上我们希望它们保留插入时的顺序,但是实际上,在PriorityQueue在进行内部排序时,它们的原始插入顺序都被破坏了,所以实际的输出时,相等元素之间的顺序是不确定的。以下是一段验证程序:
import java.util.*; public class Test1 { public static void main(String[] args) { PriorityQueue<Obj> q = new PriorityQueue<Obj>(); q.add(new Obj(1,1)); q.add(new Obj(2,1)); q.add(new Obj(1,2)); q.add(new Obj(2,2)); q.add(new Obj(1,3)); int size = q.size(); for (int i = 0; i < size; i++) { System.out.println(q.poll()); } System.out.println("--------------------------"); List<Obj> l = new ArrayList<Obj>(); l.add(new Obj(1, 1)); l.add(new Obj(2, 1)); l.add(new Obj(1, 2)); l.add(new Obj(2, 2)); l.add(new Obj(1, 3)); Collections.sort(l); for (Obj obj : l) { System.out.println(obj); } } public static class Obj implements Comparable<Obj> { int a; int b; public Obj(int a, int b) { this.a = a; this.b = b; } @Override public String toString() { return "Obj{" + "a=" + a + ", b=" + b + ‘}‘; } @Override public int compareTo(Obj o) { return a - o.getA(); } public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } } }
Obj{a=1, b=1} Obj{a=1, b=3} Obj{a=1, b=2} Obj{a=2, b=2} Obj{a=2, b=1} -------------------------- Obj{a=1, b=1} Obj{a=1, b=2} Obj{a=1, b=3} Obj{a=2, b=1} Obj{a=2, b=2}
使用PriorityQueue排序?结果可能不是你想要的,布布扣,bubuko.com
原文:http://blog.csdn.net/bluishglc/article/details/20215565