优先级队列(PriorityQueue)

队列就是一种先进先出的数据结构,优先级队列就是在队列的基础上增加了对其中的数据增加了优先级这种情况,在某些特定的情况下,我们需要对优先级高的数据进行出队列。

优先级队列(PriorityQueue)

优先级队列在集合框架中的位置,从图中,可以清楚的知道,PriorityQueue是一个类,并且继承Queue这个接口
在这里插入图片描述
对于这种数据结构,我们需要注意的是

  • 插入的数据必须要可以进行大小的比较,不能插入无法比较大小的对象,否则会抛出ClassCastException异常
  • 不能插入null对象,否则会抛出NullPointerException
  • 没有容量的一个限制,其底层可以自动的进行扩容
  • 插入和删除数据元素的时间复杂度为O( l o g 2 N log_{2} N log2N)
  • PriorityQueue其底层使用了堆这种数据结构

1、常用接口
优先级队列的构造
在这里插入图片描述

插入、删除、获取优先级最高元素
在这里插入图片描述
注意:扩容机制(JDK1.8)

 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
 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);
    }
	 private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

我们可以看到,

  • 如果容量小于64时,是按照oldCapacity*2 + 2的方式扩容的
  • 如果容量大于等于64,是按照oldCapacity*2的方式扩容的
  • 如果容量超过MAX_ARRAY_SIZE,按照MAX_ARRAY_SIZE来进行扩容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值