PriorityQueue 源码解析(三)

举报
知识浅谈 发表于 2022/10/16 10:17:48 2022/10/16
【摘要】 PriorityQueue 源码解析(三)

在这里插入图片描述

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈

PriorityQueue 源码解析(三)总结

正菜来了⛳⛳⛳

🎈PriorityQueue 源码中的函数

🍮boolean add(E e)

含义:见名知意,这个是向优先队列中添加元素,函数中调用了offer函数进行添加,我们接着看offer这个函数。

public boolean add(E e) {
     return offer(e);
}

🍮boolean offer(E e)

含义:将指定元素插入此优先级队列。

  1. 集体的操作通过下边的函数可以看出先判度e是不是为null,如果是的话,就抛出异常。
  2. 其次是判断优先队列中的元素个数size是不是大于底层数组queue的大小,如果大于就需要扩容了,调用grow函数进行扩容。如果小于的话就在数组最后添加元素,并调整堆中的数据。
public boolean offer(E e) {
  if (e == null)
        throw new NullPointerException();
    modCount++;
    int i = size;
    if (i >= queue.length)
        grow(i + 1);
    size = i + 1;
    if (i == 0)
        queue[0] = e;
    else
        siftUp(i, e);
    return true;
}

🍮 E peek()

含义: 返回堆中第一个元素,也就是返回队列中的队首元素。

public E peek() {
    return (size == 0) ? null : (E) queue[0];
}

🍮 int indexOf(Object o)

含义: 见名知意,这个就是在队列中查找指定的对象的位置,注意这个使用的是equals,而不是直接比较,因为直接比较比较的是引用值,使用equals比较的是具体的值。

    private int indexOf(Object o) {
        if (o != null) {
            for (int i = 0; i < size; i++)
                if (o.equals(queue[i]))
                    return i;
        }
        return -1;
    }

🍮boolean remove(Object o)

含义:这个函数的意思就是移除指定的对象,从下边的函数可以看出先通过indexOf查找对象是否在队列中,如果不在,直接返回false,在的话会调用removeAt(i)移除i这个位置的元素,因为i是indexOf查出的对象o在队列中的位置。

public boolean remove(Object o) {
        int i = indexOf(o);
        if (i == -1)
            return false;
        else {
            removeAt(i);
            return true;
        }
    }

🍮boolean removeEq(Object o)

含义:这个函数的含义和remove差不多,有一些区别就是这个比较的时候是直接比较的引用,而不是使用equals比较的具体的值,上边的那个函数实现调用的indexof(o)查找的o对象的位置,这个是直接进行比较的引用。

 boolean removeEq(Object o) {
     for (int i = 0; i < size; i++) {
         if (o == queue[i]) {
             removeAt(i);
             return true;
         }
     }
     return false;
 }

上边的两个函数中都提到removeAt这个函数了,具体的这个函数的内部的相关操作,我们下篇文章中深入探析。

🍚总结

以上就是关于PriorityQueue 源码部分函数的相关解析,希望有所帮助。Written By 知识浅谈

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。