我在Java中有一个队列,表现出奇怪的行为。如果我调用q.size()
,将After元素推入队列,则只有前半部分项目从同一队列中弹出。但是,如果我在q.size()
中弹出任何项目之前存储q
返回的值,则会弹出所有项目。这是为什么? official documentation说:
public int size()
返回此列表中的元素数。
这是我正在使用的代码。我使用了三种不同的编译器:JDK 6.0_31,JDK 7.0_7和Eclipse Compiler 0.A48。结果是一样的。
import java.util.*;
public class StrangeQueueTest{
public static void main(String[] args){
Queue<String> q = new LinkedList<String>();
String[] testData = {"1: one", "2: two", "3: three", "4: four", "5: five",
"6: six", "7: seven", "8: eight", "9: nine", "10: ten", "11: eleven",
"12: twelve", "13: thirteen", "14: fourteen", "15: fifteen",
"16: sixteen", "17: seventeen", "18: eighteen", "19: nineteen",
"20: twenty"};
//Push items into the queue
for(int x = 0; x < testData.length; x++)
q.add(testData[x]);
//Pop items out of the queue, calling size() at every iteration
for(int x = 0; x < q.size(); x++)
System.out.println(q.poll());
//Pop items out of the queue, calling size() once
/*int count = q.size();
for(int x = 0; x < count; x++)
System.out.println(q.poll());*/
}
}
为什么size()
方法不能正常工作?难道我做错了什么?如果是这样,是什么?
答案 0 :(得分:12)
你只获得了一半的元素,因为你是从两端算起来的,当你到达中间时你停下来。换句话说:每次poll()
,您都会将size()
减少一个。与此同时,您正在计算已删除的数量。问题是,当您删除的数字至少与剩余数量一样大时,您已将循环编码为停止。
而不是:
for(int x = 0; x < q.size(); x++)
System.out.println(q.poll());
使用它:
while (q.size() > 0)
System.out.println(q.poll());
答案 1 :(得分:1)
(这实际上是一个扩展的评论。我同意先前的答案。)
几乎总是,当API方法似乎没有遵循其规范时,问题实际上在测试程序中。接下来的问题是原始提问者如何能够找到正在发生的事情,而不仅仅是看到问题。
调试的第一步是获取信息。循环中x和q.size()的行为似乎可能相关,因此我将循环修改为:
for (int x = 0; x < q.size(); x++) {
System.out.println("x=" + x + ", q.size()=" + q.size());
System.out.println(q.poll());
}
并运行程序。输出是:
x=0, q.size()=20
1: one
x=1, q.size()=19
2: two
x=2, q.size()=18
3: three
x=3, q.size()=17
4: four
x=4, q.size()=16
5: five
x=5, q.size()=15
6: six
x=6, q.size()=14
7: seven
x=7, q.size()=13
8: eight
x=8, q.size()=12
9: nine
x=9, q.size()=11
10: ten
这个输出很明显,循环的每次迭代都会增加x并减小队列大小,导致x stop小于中途的大小。