奇怪的队列行为

cty*_*e.h 1 java queue data-structures

我有一个Java的队列,表现出奇怪的行为.如果我调用q.size(),After元素被推入队列,只有前半部分项目从同一队列中弹出.但是,如果我q.size()在弹出任何项目之前存储返回的值,则会弹出所有项目q.这是为什么?在官方文件说:

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());*/
   }
}
Run Code Online (Sandbox Code Playgroud)

为什么size()方法不能正常工作?难道我做错了什么?如果是这样,什么?

Ted*_*opp 12

你只得到了一半的元素,因为你是从两端算起来的,当你到达中间时你会停下来.换句话说:每次poll()你减少size()一个.与此同时,您正在计算已删除的数量.问题是,当您删除的数字至少与剩余大小一样大时,您已将循环编码为停止.

而不是这个:

for(int x = 0; x < q.size(); x++)
     System.out.println(q.poll());
Run Code Online (Sandbox Code Playgroud)

用这个:

while (q.size() > 0)
     System.out.println(q.poll());
Run Code Online (Sandbox Code Playgroud)