Asumiendo que esto es lo que quería decir:
// 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
}
iterador es más rápido para las colecciones que no tienen acceso al azar (por ejemplo TreeSet, HashMap, LinkedList). Para arrays y ArrayLists, las diferencias de rendimiento deben ser insignificantes.
Editar: Creo que el micro-benchmarking es la raíz de casi el mal, al igual que la optimización temprana. Pero, de nuevo, creo que es bueno sentir las implicaciones de cosas tan triviales. Por lo tanto me he encontrado a small test:
- repetir un LinkedList y un ArrayList respecively
- con 100.000 cuerdas "al azar"
- resumiendo su longitud (sólo algo para evitar que el compilador optimiza la distancia a todo el bucle)
- utilizando todos los estilos 3 de bucle (iterador, para cada uno, para con el contador)
resultados son similares para todos, pero "para con el contador" con LinkedList. Los otros cinco tomaron menos de 20 milisegundos para iterar en toda la lista. El uso de list.get(i)
en una lista vinculada 100,000 veces tomó más de 2 minutos (!) En completarse (60,000 veces más lento). ¡Guauu! :) Por lo tanto, es mejor utilizar un iterador (que se utiliza explícita o implícitamente para cada uno), especialmente si no sabes de qué tipo y tamaño de lista se trata.
observan que la razón de un bucle for es más lento con una lista enlazada, es que cada llamada a 'get (i)' repite desde la cabeza de la lista I '' tiempos.Estoy seguro de que es intuitivamente obvio para todos los demás aquí, pero me tomó un minuto averiguar por qué. –