1. PriorityQueueQueue的区别在于,它的出队顺序与元素的优先级有关,对PriorityQueue调用remove()poll()方法,返回的总是优先级最高的元素。

      1. public static void main(String[] args) {
      2. Queue<String> q = new PriorityQueue<>();
      3. q.offer("apple");
      4. q.offer("pear");
      5. q.offer("banana");
      6. System.out.println(q.poll()); // apple
      7. System.out.println(q.poll()); // banana
      8. System.out.println(q.poll()); // pear
      9. System.out.println(q.poll()); // null,因为队列为空
      10. }

      注意:PriorityQueue默认按元素比较的顺序排序(必须实现Comparable接口),也可以通过Comparator自定义排序算法(元素就不必实现Comparable接口)。

    2. PriorityQueue允许我们提供一个Comparator对象来判断两个元素的顺序。我们以银行排队业务为例,实现一个PriorityQueue: ```java public class Main { public static void main(String[] args) {

      1. Queue<User> q = new PriorityQueue<>(new UserComparator());
      2. // 添加3个元素到队列:
      3. q.offer(new User("Bob", "A1"));
      4. q.offer(new User("Alice", "A2"));
      5. q.offer(new User("Boss", "V1"));
      6. System.out.println(q.poll()); // Boss/V1
      7. System.out.println(q.poll()); // Bob/A1
      8. System.out.println(q.poll()); // Alice/A2
      9. System.out.println(q.poll()); // null,因为队列为空

      } }

    class UserComparator implements Comparator { public int compare(User u1, User u2) { if (u1.number.charAt(0) == u2.number.charAt(0)) { // 如果两人的号都是A开头或者都是V开头,比较号的大小: return u1.number.compareTo(u2.number); } if (u1.number.charAt(0) == ‘V’) { // u1的号码是V开头,优先级高: return -1; } else { return 1; } } }

    class User { public final String name; public final String number;

    public User(String name, String number) {
        this.name = name;
        this.number = number;
    }
    
    public String toString() {
        return name + "/" + number;
    }
    

    } ```