共同学习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 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讲解完毕 这个类我到了最后才明白大致原理所以之前的讲解可能有误 请见谅

你可能感兴趣的:(Java)