est-il possible d'avoir plusieurs itérateurs dans une seule collection et de suivre chaque piste de garder indépendamment? Ceci assume aucune suppression ou insertion après l'attribution des itérateurs. P>
5 Réponses :
oui. p>
Parfois, il est vraiment gênant que des réponses doivent avoir 30 caractères. P>
D'accord. Java va-t-elle apparaître les fils automatiquement et synchronisera-t-elle?
@CP: Les itérateurs ne sont pas liés aux threads. Tout threading doit être fait par vous.
Donc, si je crée deux itérateurs d'une collection, ils ne sont pas dans des threads et des inserts distincts / suppressions ne seront pas inclus dans aucune utilisation?
@CP: Que se passe-t-il entièrement à vous, en fonction de la manière dont vous utilisez les itérateurs et la collection sous-jacente. Si vous commencez à itération via un itérateur, puis modifiez la collection sans utiliser l'itérateur, vous obtiendrez ConcurrentModificationException code> lorsque vous continuez itération.
Oui, c'est possible. C'est une des raisons pour lesquelles ils sont des itérateurs et non simplement des méthodes de la collection. P>
Par exemple List Code> Itérateurs (défini dans
AbstractList code>) Tenir un
int code> à l'index actuel (pour l'itérateur). Si vous créez plusieurs itérateurs et appelez
suivant () code> un nombre de fois différent, chacun d'eux aura son
du curseur code> avec une valeur différente. P>
Avec les collections simultanées, vous pouvez avoir plusieurs itérateurs dans différents threads, même s'il n'y a pas d'insertion et de suppression. P>
oui et non. Cela dépend de la mise en œuvre de l'interface Il doit généralement renvoyer une nouvelle instance d'une classe qui implémente une interface itérade, l'abstraction de la classe implémente ceci comme celui-là: P> < Pré> xxx pré> Si vous utilisez des classes Java standard, vous pouvez vous attendre à ce que cela soit fait de cette façon. p> sinon vous pouvez faire un test simple en appelant ibler
itérateur () code> former l'objet, puis exécuté d'abord et après cette seconde, si elles dépendent que la seconde ne doit pas produire de résultat. Mais c'est très peu probable possible. p> p>
Vous pouvez faire quelque chose comme ceci:
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); } } }
Qu'est-il arrivé quand tu as essayé?