2013-09-01 11 views
5

私はリストの反復を練習しています。私の質問は、なぜこれら二つの方法が異なる結果をもたらすのかということです。これらの2つのリストイテレータが異なる動作をするのはなぜですか?

最初のコードは、無限ループを出力します。一方、インデックスの次の文字列を出力します。

私はjavaを初めて使っています。これは私の最初の言語です。

public static void main(String[] args) { 


    String[] hi = {"yo", "wat", "sup"}; 
    List<String> l1 = new ArrayList(Arrays.asList(hi)); 

    while (l1.iterator().hasNext()) { 


     System.out.println(l1.iterator().next()); 
     ; 
    } 
    } 

VS

public static void main(String[] args) { 


    String[] hi = {"yo", "wat", "sup"}; 
    List<String> l1 = new ArrayList(Arrays.asList(hi)); 

    Iterator<String> rator = l1.iterator(); 

    while (rator.hasNext()) { 
     System.out.println(rator.next()); 
    } 
} 

答えて

6

l1.iterator(常に新しいイテレータを生成します。最初のコードでは、新しいイテレータを作成し、それを破棄し、再作成して、再び破棄します。イテレータは最後に到達するチャンスを得られないので、決してループを終了することはありません。

+1

基本的に.iteratorは、whileメソッドが実行されるたびに新しいイテレータですか? –

+0

@TinLeはい、そうです。 – hexafraction

0

最初のケースでは、ループ内の条件を確認するたびに、新しいIterator(最初の要素から何度も繰り返し始めます)を作成しています。次に、println(ループごとに2つのイテレータを作成)にそれらのうちの多くを作成します。プログラムは最初の要素("yo")を無限に表示します。

関連する問題