PriorityQueue是基于堆的无界队列,它不遵循先进先出的原则,队首元素是按照指定顺序排序后的第一个元素。它不允许值为null。
存储结构
1 | // 由于Java使用的是类型擦除式泛型,因此不允许直接定义泛型数组 |
常量
1 | // 默认的初始化容量为11 |
构造方法
1 | public PriorityQueue() { |
插入操作
PriorityQueue要求插入的元素必须是可比较的,即要么实现了Comparable接口,要么在构造方法中指定了Comparator。否则,将抛出类型转换异常。
1 | public boolean offer(E e) { |
当队列不为空时,需要向上寻找当前结点的插入位置,该操作由siftUp方法实现。
1 | private void siftUp(int k, E x) { |
由于根结点的下标为0,因此,下标为i的结点,它的左孩子的下标为2i + 1,右孩子的下标为2i + 2。
反过来,如果当前结点的下标为k,那么父结点的下标为(k - 1) / 2。
扩容机制
如果原来的容量oldCapacity < 64,则新的容量newCapacity = 2 * oldCapacity + 2;
否则,新的容量newCapacity = 1.5 * oldCapacity。
1 | private void grow(int minCapacity) { |
这里调用了hugeCapacity方法,用于处理容量溢出。
1 | private static int hugeCapacity(int minCapacity) { |
删除操作
1 | "unchecked") ( |
当队列中的元素个数>=2时,需要向下寻找当前结点的插入位置,该操作由siftDown方法实现。
1 | private void siftDown(int k, E x) { |