2011-03-15 4 views

答えて

10

はい。

回答が30文字でなければならないことがあります。

+0

合意。 Javaはスレッドを自動的に生成して同期化しますか? –

+0

@cp:反復子はスレッドと無関係です。どんなスレッドもあなたによって行われなければなりません。 – ColinD

+0

したがって、1つのコレクションの2つのイテレーターを作成した場合、それらは別々のスレッドにはなく、挿入/削除は使用されません。 –

6

はい、可能です。それがコレクションの単なるメソッドではなくイテレータである理由の1つです。

たとえば、Listイテレータ(AbstractListで定義)は、イテレータの現在のインデックスにintを保持します。複数のイテレータを作成してnext()を異なる回数呼び出すと、それぞれの値は異なる値のint cursorになります。

0

同時収集では、挿入と削除があっても、異なるスレッドに複数のイテレータを持つことができます。

1

はい、いいえ。それはインターフェイスIterable<T>の実装に依存します。

通常、それは反復処理可能なインタフェースを実装するクラスの新しいインスタンスを返す必要があり、クラスAbstractListはそのようにこれを実装しています

public Iterator<E> iterator() { 
    return new Itr(); //Where Itr is an internal private class that implement Itrable<T> 
} 

あなたはあなたが、これはこのように行われることを期待して、標準のJavaクラスを使用している場合。

それ以外の場合は、iterator()というオブジェクトを呼び出すことで簡単にテストを実行し、最初に実行してから2番目のものを実行し、2番目のものが依存する場合は結果を生成しません。しかし、これは可能性はほとんどありません。

1

あなたはこのような何か行うことができます:あなたがしようとしたときに何が起こった

import java.util.ArrayList; 
import java.util.Iterator; 

public class Miterate { 

    abstract class IteratorCaster<E> implements Iterable<E>, Iterator<E> { 
     int mIteratorIndex = 0; 

     public boolean hasNext() { 
      return mStorage.size() > mIteratorIndex; 
     } 

     public void remove() { 
     } 

     public Iterator<E> iterator() { 
      return this; 
     } 
    } 

    class FloatCast extends IteratorCaster<Float> { 
     public Float next() { 
      Float tFloat = Float.parseFloat((String)mStorage.get(mIteratorIndex)); 
      mIteratorIndex ++; 
      return tFloat; 
     } 
    } 

    class StringCast extends IteratorCaster<String> { 
     public String next() { 
      String tString = (String)mStorage.get(mIteratorIndex); 
      mIteratorIndex ++; 
      return tString; 
     } 
    } 

    class IntegerCast extends IteratorCaster<Integer> { 
     public Integer next() { 
      Integer tInteger = Integer.parseInt((String)mStorage.get(mIteratorIndex)); 
      mIteratorIndex ++; 
      return tInteger; 
     } 
    } 

    ArrayList<Object> mStorage; 

    StringCast mSC; 
    IntegerCast mIC; 
    FloatCast mFC; 

    Miterate() { 
     mStorage = new ArrayList<Object>(); 

     mSC = new StringCast(); 
     mIC = new IntegerCast(); 
     mFC = new FloatCast(); 


     mStorage.add(new String("1")); 
     mStorage.add(new String("2")); 
     mStorage.add(new String("3")); 
    } 

    Iterable<String> getStringIterator() { 
     return mSC; 
    } 

    Iterable<Integer> getIntegerIterator() { 
     return mIC; 
    } 

    Iterable<Float> getFloatIterator() { 
     return mFC; 
    } 

    public static void main(String[] args) { 
     Miterate tMiterate = new Miterate(); 

     for (String tString : tMiterate.getStringIterator()) { 
      System.out.println(tString); 
     } 

     for (Integer tInteger : tMiterate.getIntegerIterator()) { 
      System.out.println(tInteger); 
     } 

     for (Float tFloat : tMiterate.getFloatIterator()) { 
      System.out.println(tFloat); 
     } 
    } 
} 
関連する問題