1

奇妙な動作を示す Java のキューがあります。を呼び出すとq.size()、要素がキューにプッシュされた後、アイテムの前半のみが同じキューからポップアウトされます。q.size()ただし、からアイテムをポップする前に、によって返された値を保存すると、すべてのアイテムがポップされqます。何故ですか?公式ドキュメントには次のように書かれています。

public int size()

このリスト内の要素の数を返します。

これが私が使用しているコードです。JDK 6.0_31、JDK 7.0_7、および Eclipse Compiler 0.A48 の 3 つの異なるコンパイラを使用しました。結果は同じです。

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()メソッドが一貫して機能しないのはなぜですか? 私は何か間違ったことをしていますか?もしそうなら、何?

4

2 に答える 2

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 がサイズよりも小さくなってしまいます。

于 2012-11-28T06:05:49.737 に答える