jdk优先级队列是如何实现的

在jdk中,自带了一个优先级队列,scheduledThreadPoolExecutor自己内部也实现了一个优先级队列

我们先不考虑jdk是如何实现的,其实让我们自己去实现一个优先级队列的实现的话,完全可以这样来做:
在入队的时候,根据当前key对应的hash值,或者是根据自己的特定的比较规则,从第一个元素开始对比,如果当前要入队的元素优先级小于队列中的第一个key,就插入到前面,反之,继续往后去对比,这样就可以实现一个简单的优先级队列,在每次取出来第一个元素的时候,就是优先级最高的

所以:对于优先级队列来说,最为重要的就是:优先级的比较规则

PriorityQueue

那来看下PriorityQueue在入队的时候,是怎么做的

// 这是存储元素的数据结构
transient Object[] queue; // non-private to simplify nested class access

// 这是规则比较器,其实就是来比较哪个优先级高,哪个优先级低
private final Comparator<? super E> comparator;

入队方法

我们来看下offer入队方法

public boolean offer(E e) {
   
        // 1.如果入队的元素为null,抛出异常
        if (e == null)
            throw new NullPointerException();
        modCount++;
        int i = size;
        // 2.如果当前元素个数大于等于数组长度,就扩容
        if (i >= queue.length)
            grow(i + 1);
        size = i + 1;
        // 3.如果数组为空,是第一个入队的元素,就直接放到第一个位置即可,无需比较
        if (i == 0)
            queue[0] = e;
        else
            // 4.否则,就需要进行优先级的比较
            siftUp(i, e);
        return true;
    }

和其他队列唯一的区别是:这里多了一个优先级比较的步骤

接着来看下是如何进行优先级的排序的

优先级比较
private void siftUp(int k, E x) {
   
    if (comparator != null)
        siftUpUsingComparator(k, x);
    else
        siftUpComparable(k, x);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值