java常用类-优先级队列PriorityQueue


看文档
实现了四个接口Serializable , Iterable , Collection , Queue
序列化,可迭代,是个Collection类型的集合,队列性质,是一点多余的东西都没有啊
但是,线程不安全!!!

使用方法:同一般集合
但是每次队头出来的都是高优先级元素,那既然是优先级了,就必须有依据标准:怎么排序,通过构造方法提供排序依据(Comparator接口)

0.构造方法

a.空参构造:具有默认的初始容量(11),根据它们的natural ordering对其元素进行排序 。
b.PriorityQueue(int initialCapacity) 设置初始容量
c.PriorityQueue(Comparator<? super E> comparator)
创建具有默认初始容量的 PriorityQueue ,并根据指定的比较器对其元素进行排序。
d....
例如:


PriorityQueue pq=new PriorityQueue<>(new Comparator(){
        @Override
        public int compare(LinkNode l1, LinkNode l2) {
            return (int)(l1.val-l2.val);
        }
    });

1.插入元素:

boolean add(E e)
boolean offer(E e)

区别:

区别是没有区别

底层

    public boolean add(E e) {
        return offer(e);
    }

    /**
     * Inserts the specified element into this priority queue.
     *
     * @return {@code true} (as specified by {@link Queue#offer})
     * @throws ClassCastException if the specified element cannot be
     *         compared with elements currently in this priority queue
     *         according to the priority queue's ordering
     * @throws NullPointerException if the specified element is null
     */
    public boolean offer(E e) {
        if (e == null)
            throw new NullPointerException();
        modCount++;
        int i = size;
        if (i >= queue.length)
            grow(i + 1);
        siftUp(i, e);
        size = i + 1;
        return true;
    }

2.peek()

检索但不删除此队列的头,如果此队列为空,则返回 null 。

3.poll()

检索并删除此队列的头,如果此队列为空,则返回 null 。

4.remove(Object o)

从该队列中删除指定元素的单个实例(如果存在)。

5.size()