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)