PriorityQueue源码分析

优先队列

  1. 内部实现是是堆,结构是数组,使用堆排序
  2. 初始化容量11,如果插入数的时候,大于当前队列数组容量,则扩容
  3. 扩容方案:如果当前数组小于64,则扩容一倍,如果大于,则扩容50%, 这用Arrays.copyOf将原有数组放到另一块新的空间

内部实现堆排序主要靠三个函数(private):
堆排序,父节点:i,两个儿子节点:2i+1、2i+2
最大堆为例(可以comparator来自定义优先级):

  1. siftup(k,E):k插入位置,E插入的元素,将E从当前位置k不断上浮(与父节点比较,如果大于父节点,父子交换,继续上浮),找到E元素应该的位置
  2. siftDown(k,E):k插入位置,E插入的元素,将E从当前位置k不断下浮(与当前节点左右子节点比较,如果小于左or右子节点,父子交换,继续下沉),找到E元素应该的位置
  3. heapify(): 初始化堆,从非叶子结点进行下沉siftDown调整,最终结果最大元素在堆顶。相当于堆排序的第一步。
    可见:PriorityQueue队列并非所有元素有序,只是保证第一个元素优先级最高。

核心函数(public):

  1. offer(E e),队列中插入e元素:1. 是否需要扩容;2. 将e元素插入队尾,上浮siftup(size, E)
  2. remove(E e), 队列中删除e元素:
    1)找到e元素在队列中的index(直接遍历数组找就行),
    2) 如果index==size-1,index位置直接为null即可;
    3) 将末尾的元素放到index位置,下浮siftDown(index, E),如果没有下浮,则上浮,如果上浮成功,则返回最末尾元素(因为如果是遍历,因为最末尾元素上浮,无法访问到该元素,要把该元素返回供访问)其他情况返回null(因为下浮或者在index位置,都可以访问到该元素,所以直接返回null即可)

参考:
https://www.jianshu.com/p/df781ec91740

你可能感兴趣的:(每日总结,源码分析,java)