Supponendo che questo è quello che volevi dire:
// traditional for loop
for (int i = 0; i < collection.size(); i++) {
T obj = collection.get(i);
// snip
}
// using iterator
Iterator<T> iter = collection.iterator();
while (iter.hasNext()) {
T obj = iter.next();
// snip
}
// using iterator internally (confirm it yourself using javap -c)
for (T obj : collection) {
// snip
}
Iterator è più veloce per le collezioni che non hanno accesso casuale (ad esempio TreeSet, HashMap, LinkedList). Per le matrici e le liste di array, le differenze di prestazioni dovrebbero essere trascurabili.
Edit: Credo che il micro-benchmarking sia la radice del male, proprio come l'ottimizzazione iniziale. Ma ripeto, penso sia bello avere un sentimento per le implicazioni di cose così banali. Quindi Ho eseguito a small test:
- iterazioni su una LinkedList e un ArrayList respecively
- con 100.000 stringhe "casuali"
- riassumendo la loro lunghezza (solo qualcosa per evitare che il compilatore ottimizza via l'intero anello)
- utilizzando tutti gli stili 3 ciclo (iteratore, per ciascuno, per con il contatore)
risultati sono simili per tutti, ma "per con il contatore" con LinkedList. Tutti gli altri cinque hanno impiegato meno di 20 millisecondi per scorrere l'intera lista. Utilizzo di list.get(i)
su una lista collegata 100.000 volte ha impiegato più di 2 minuti (!) Per completare (60.000 volte più lento). Wow! :) Quindi è meglio usare un iteratore (usando esplicitamente o implicitamente per ciascuno), specialmente se non si conosce il tipo e la dimensione della lista con cui si sta trattando.
Si noti che il ciclo di Reason a for è più lento con una lista collegata, è che ogni chiamata a 'get (i)' itera dalla testa della lista 'i' volte.Sono sicuro che sia intuitivamente ovvio per tutti gli altri qui, ma mi ci è voluto un minuto per capire il perché. –