Java 队列中有更多我放入的项目

Java 队列中有更多我放入的项目,java,debugging,queue,Java,Debugging,Queue,在我的Java程序中,我初始化了一个包含从0到1000的所有数字的队列 emptyFrames = new PriorityQueue<Integer>(); for (int i = 0; i < 1000; i++) { emptyFrames.add(i); } System.out.println("Debug"); emptyFrames=new PriorityQueue();

在我的Java程序中,我初始化了一个包含从0到1000的所有数字的队列

        emptyFrames = new PriorityQueue<Integer>();
        for (int i = 0; i < 1000; i++) {
            emptyFrames.add(i);
        }
        System.out.println("Debug");
emptyFrames=new PriorityQueue();
对于(int i=0;i<1000;i++){
清空框架。添加(i);
}
System.out.println(“调试”);
但是,当我进入调试时,队列中有
1155


为什么会发生这种情况?

PriorityQueue会根据其容纳更多元素的能力在内部调整自身大小。这是收藏的一个共同特征

发件人:

优先级队列是无界的,但其内部容量控制用于存储队列上元素的数组的大小。它始终至少与队列大小一样大。当元素添加到优先级队列时,其容量会自动增长。未指定增长策略的详细信息


大于1000的索引与队列的容量有关,而与队列的大小无关

在内部,
PriorityQueue
由一个对象数组支持。将对象添加到具有完整备份阵列的队列时,队列将通过调用
grow
适度扩展阵列,以便为将来的
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);
}
private void grow(int minCapacity){
int oldCapacity=queue.length;
//如果规模较小,则增加一倍;否则增长50%
int newCapacity=oldCapacity+((oldCapacity<64)?
(旧容量+2):
(旧容量>>1));
//有溢出意识的代码
if(新容量-最大阵列大小>0)
新容量=大容量(最小容量);
queue=Arrays.copyOf(queue,newCapacity);
}

从中检索的代码。

您正在查看两条不同的信息

首先,队列的正式大小是1000—其中只有1000个元素。您可以使用
emptyFrames.size()
验证这一点

其次,Eclipse似乎向您展示了支持数组,它不能很好地反映队列中当前存在的元素总数。该阵列的大小将发生波动


在这种情况下,支持阵列不是您应该信任的东西;只检查集合的
size()

这里没有很多信息。队列还用在哪里?如果打印的不是“debug”,而是
emptyFrames.size()
,会发生什么?如果创建初始容量为1000的队列会发生什么
emptyFrames=newpriorityqueue(1000)请向我们显示整个代码。队列中的项目数与您输入的项目数完全相同,但其容量远远大于添加的元素数
emptyFrames。size()
确实返回1000。weird@Makoto我不是在暗示两者都不是;这是预期的行为,我不同意。我不希望队列的正式大小超过我插入队列的大小。我并不反对调整大小可能会导致其备份存储比我插入的存储稍微大一点,但我不希望将其作为其大小的一部分进行报告。对我来说,这很有道理,下行投票人能解释这个答案的错误吗?@Makoto队列的正式大小仍然是
1000
;问题中没有任何其他说明。问题中所示的调试正在查看队列的备份数组。这个答案是正确的。优先级队列的大小与支持它的数组的大小之间存在差异。OP看到的是支持数组的内容,它可能依赖于实现。重要的是队列的大小……否决票应该颠倒过来。