共同学习Java源代码-数据结构-PriorityQueue类(八)

    private void heapify() {
        for (int i = (size >>> 1) - 1; i >= 0; i--)
            siftDown(i, (E) queue[i]);

    }

这个方法是堆化的方法 我现在才搞明白PriorityQueue的存储方式是用数组存储二叉树 0下标为根节点 2n+1下标为左节点 2n+2下标为右节点 (n-1)/2下标为父节点 n为数组下标值 

PriorityQueue是完全二叉树和最小堆 这个方法就是保证堆不变性 就是每个父节点都要小于左右子节点 

实现过程就是遍历数组前一半的元素 然后挨个调用siftDown方法


    public Comparator<? super E> comparator() {
        return comparator;
    }

comparator的getter


    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        s.defaultWriteObject();
        s.writeInt(Math.max(2, size + 1));
        for (int i = 0; i < size; i++)
            s.writeObject(queue[i]);
    }

这个是序列化输出的方法 

多数步骤都和以前的Collection实现类一样 就是writeInt那块是写出2和size+1的最大值 作为数组长度


    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        s.readInt();
        queue = new Object[size];
        for (int i = 0; i < size; i++)
            queue[i] = s.readObject();
        heapify();
    }

这个是序列化读入的方法 和多数Collection实现类大致相同 

就是最后调用heapify方法调整二叉树在数组中的顺序



PriorityQueue讲解完毕 这个类我到了最后才明白大致原理所以之前的讲解可能有误 请见谅

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值