在我的Java程序中,我初始化了一个队列,其中所有数字都是0到1000。
emptyFrames = new PriorityQueue<Integer>();
for (int i = 0; i < 1000; i++) {
emptyFrames.add(i);
}
System.out.println("Debug");
但是,当我进入调试时,队列中有1155
项。
答案 0 :(得分:5)
大于1000的索引与队列的容量有关,而不是与其大小相关。
在内部,PriorityQueue
由一组对象支持。将对象添加到具有完整后备阵列的队列时,队列将通过调用grow
将数组扩展适中,以便将来可以使用内部空间( capacity ) add
来电。这避免了每次调用add
时队列必须扩展其数组,这将是非常低效的。
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);
}
从Docjar检索的代码。
答案 1 :(得分:1)
PriorityQueue根据其容纳更多元素的容量在内部调整自身大小。这是集合的一个共同特征。
来自Java:
优先级队列是无限制的,但具有内部容量,用于控制用于存储队列中元素的数组的大小。它始终至少与队列大小一样大。当元素添加到优先级队列时,其容量会自动增加。没有具体说明增长政策的细节。
答案 2 :(得分:-1)
您正在查看两条不同的信息。
首先,队列的正式大小为1,000 - 其中只有1,000个元素。您可以使用emptyFrames.size()
验证这一点。
其次,似乎Eclipse正在向您显示支持数组,这不能很好地反映当前队列中存在的元素总数。该数组的大小将会波动based on its internal resizing rules。
在这种情况下,支持数组不是你应该信任的东西;只改为检查集合的size()
。