isEmpty() 与优先级队列中的 size() == 0 有何不同

How is isEmpty() different from size() == 0 in Priority Queue

所以我正在做 leetcode 问题 "Top K Frequent Element" 并且我使用了 priorityQueue 作为频率。当我开始轮询数字并插入 arraylist 时,for 循环不会以某种方式轮询队列中的所有元素。为什么?

(假设PQ有两个元素)

    while(!pq.isEmpty()){
        ls.add(pq.poll());
    }

    for(int b = 0; b < pq.size();b++){
        ls.add(pq.poll());
    }

这两个循环不应该打印出同样的东西吗?

我从 while 循环中得到了正确答案,而我从 for 循环中只得到了一个元素

与第二种方法的不同之处在于,b < pq.size() 的值在每次迭代时 变化 ,因为当您删除元素时元素数量会减少:pq.poll()。要获得相同的结果(假设我们在进行迭代时不向队列中添加更多元素),试试这个:

for (int b = 0, n = pq.size(); b < n; b++) {
    ls.add(pq.poll());
}

在上面的代码片段中,我们在迭代开始时将 pq 的大小恰好保存 一次 ,以确保它不会改变。这会更好,因为它考虑了并发 insertions/deletions:

的情况
while (pq.size() > 0) {
    ls.add(pq.poll());
}