PriorityQueue 源码解析(二)

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
PriorityQueue 源码解析(二)总结
 🤞这次都给他拿下🤞
正菜来了⛳⛳⛳
🎈PriorityQueue 源码解析-函数篇
上篇中谈到了initElementsFromCollection和initFromPriorityQueue和initFromCollection这两个函数。
三个函数的调用路径:
 
🍮initFromPriorityQueue
含义: 见名知意,从一个有限队列中初始化当前队列,首先判断c是不是优先队列,如果是的话,直接把当前队列中数组queue指向c队列的转化成的数组,size指向c的大小。
private void initFromPriorityQueue(PriorityQueue<? extends E> c) {
    if (c.getClass() == PriorityQueue.class) {
        this.queue = c.toArray();
        this.size = c.size();
    } else {
        initFromCollection(c);
    }
}
 
 上边如果传入的不是优先队列,就可以调用initFromCollection,从集合中初始化当前队列。
🍮initFromCollection
含义: 使用给定集合中的元素初始化队列数组。这个就不想上边的那个,这个直接调用了initElementsFromCollection(c).
private void initFromCollection(Collection<? extends E> c) {
    initElementsFromCollection(c);
    heapify();
}
 
 接着看initElementsFromCollection这个函数的操作。
🍮initElementsFromCollection
含义: 从下边的函数的具体实现中可以看出,先把集合c转换为一个Object数组,然后对数组的类型以及数组中间的元素进行检查,查看是否有null的,如果有就抛出异常,如果没有就把当前创建的优先队列对象的queue指向a。
 private void initElementsFromCollection(Collection<? extends E> c) {
     Object[] a = c.toArray();
     // If c.toArray incorrectly doesn't return Object[], copy it.
     if (a.getClass() != Object[].class)
         a = Arrays.copyOf(a, a.length, Object[].class);
     int len = a.length;
     if (len == 1 || this.comparator != null)
         for (int i = 0; i < len; i++)
             if (a[i] == null)
                 throw new NullPointerException();
     this.queue = a;
     this.size = a.length;
 }
 
 函数中涉及到的heapify()之后再分析。
🍮grow(int minCapacity)
含义: Increases the capacity of the array.增加队列中的容量,从下边的函数中可以判断扩容的时候先判断旧容量是否小于64,如果小于就在原有的数量上加2,否则就扩大一倍容量,之后再调用hugeCapacity判断新容量是都大于MAX_ARRAY_SIZE,大于的话判断传递过来的minCapacity是否大于MAX_ARRAY_SIZE,是的话就返回Integer的最大值。
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);
}
 
 🍮int hugeCapacity(int minCapacity)
含义:从这个函数中可以看出,会对传入的minCapacity进行判断是否大于MAX_ARRAY_SIZE,大于的话就返回Integer.MAX_VALUE,也就是整数的最大值,否则就返回MAX_ARRAY_SIZE。
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}
 
 🍚总结
以后就是关于PriorityQueue 中源码中的部分函数的总结,希望有所帮助。
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)