队列中有更多项目

时间:2015-08-16 22:38:06

标签: java debugging queue

在我的Java程序中,我初始化了一个队列,其中所有数字都是0到1000。

        emptyFrames = new PriorityQueue<Integer>();
        for (int i = 0; i < 1000; i++) {
            emptyFrames.add(i);
        }
        System.out.println("Debug");

但是,当我进入调试时,队列中有1155项。

Debug 为什么会这样?

3 个答案:

答案 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()