Java PriorityQueue源码学习

public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable 1.5


  1. 自动扩容 ,初始化默认11,小于64时2倍扩容,大于64时1.5倍扩容。

    private void grow(int minCapacity) {
        int oldCapacity = queue.length;
        // Double size if small; else grow by 50%
        int newCapacity = oldCapacity + ((oldCapacity < 64) ?
                                         (oldCapacity + 2) :
                                         (oldCapacity >> 1));
        // overflow-conscious code
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        queue = Arrays.copyOf(queue, newCapacity);
    }
    
  2. Add 节点上浮,Remove节点下沉。

    private void siftUpComparable(int k, E x) {
        Comparable<? super E> key = (Comparable<? super E>) x;
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = queue[parent];
            if (key.compareTo((E) e) >= 0)
                break;
            queue[k] = e;
            k = parent;
        }
        queue[k] = key;
    }
    
    private void siftDownComparable(int k, E x) {
        Comparable<? super E> key = (Comparable<? super E>)x;
        int half = size >>> 1;        // loop while a non-leaf
        while (k < half) {
            int child = (k << 1) + 1; // assume left child is least
            Object c = queue[child];
            int right = child + 1;
            if (right < size &&
                ((Comparable<? super E>) c).compareTo((E) queue[right]) > 0)
                c = queue[child = right];
            if (key.compareTo((E) c) <= 0)
                break;
            queue[k] = c;
            k = child;
        }
        queue[k] = key;
    }
    
  3. 构建堆

    private void heapify() {
        for (int i = (size >>> 1) - 1; i >= 0; i--)//非叶子节点开始
            siftDown(i, (E) queue[i]); //下沉
    }
    
  4. 总结
    PriorityQueue默认是最小堆,头结点最小。
    O(log(n)) time for the enqueuing and dequeuing methods offer, poll, remove() and add;
    O(n) time for the remove(Object) and contains(Object) methods,先找位置;
    O(1) time for the retrieval methods peek,element, and size.


@梦工厂 2018.3.11

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,294评论 0 16
  • 前言 众所周知堆排序就是个二叉堆,其实本质上就是个完全二叉树,我其实是想讲堆排序的,可为什么会和优先队列扯上关系呢...
    赵志文学编程阅读 349评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  • 此时已经深夜了,脑子里空空如也,繁杂的思绪到处窜。而立之年,居然找不到大笑的理由,心凉凉的,没有热度,其实渴望有那...
    芳菲语阅读 141评论 0 0
  • 整体:注重现实,对安全感较为关注…强调自我存在感,对环境感知无压力,倔强,规则性强,好幻想…幼稚,情绪化…人格生硬...
    师父的八爷阅读 166评论 0 0