2010-08-29 47 views
11

estaba navegando por el ejemplo de código siguiente:¿Cuáles son los beneficios de utilizar un iterador en Java

public class GenericTest { 

public static void main (String[] args) { 

    ArrayList<String> myList = new ArrayList<String>(); 
    String s1 = "one"; 
    String s2 = "two"; 
    String s3 = "three"; 

    myList.add(s1); myList.add(s2); myList.add(s3); 
    String st; 

    Iterator<String> itr = myList.iterator(); 

    while (itr.hasNext()) { 
    st = itr.next(); 
    System.out.println(st); 
    } 
} 
} 

Me pregunto cuáles son las ventajas de usar una implementación de la interfaz Iterator en lugar de utilizar una llanura ¿para cada bucle?

for (String str : myList) { 
    System.out.println(str); 
} 

Si este ejemplo no es relevante, lo que sería una buena situación en la que debemos utilizar el iterador?

Gracias.

+5

Por un lado, el bucle for-each no es simple ni antiguo: se introdujo oficialmente como el "bucle forzado mejorado" en Java 5. –

+1

posible duplicado de [¿Cuáles son los beneficios de la interfaz del iterador en Java?] (http://stackoverflow.com/questions/89891/what-are-the-benefits-of-the-iterator-interface-in-java) – BalusC

Respuesta

7

El For-Each Loop se introdujo con Java 5, por lo que no es tan "viejo".

Si sólo desea recorrer una colección debe utilizar el para cada lazo

for (String str : myList) { 
    System.out.println(str); 
} 

Pero a veces el método de la "viejo y simple" iterador es muy útil hasNext() para comprobar si hay más elementos para el iterador.

for (Iterator<String> it = myList.iterator(); it.hasNext();) { 
    String str = it.next(); 
    System.out.print(str); 
    if (it.hasNext()) { 
     System.out.print(";");  
    } 
} 

También puede llamar it.remove() para eliminar el elemento más reciente que fue devuelto por lado.

Y está el ListIterator<E> que proporciona un recorrido bidireccional it.next() y it.previous().

Por lo tanto, no son equivalentes. Ambos son necesarios.

+0

gracias, esto responde mi pregunta. – chronical

0

Ambos son equivalentes en funcionamiento y rendimiento en casi todos los casos. La única diferencia es que los Iteradores son compatibles con las versiones anteriores de Java JVM, mientras que la nueva sintaxis "para" solo se introdujo en JSDK 1.5 ("Java 5"), y algunas personas quieren seguir siendo compatibles con la versión 1.4 o anterior.

2
for (String str : myList) { System.out.println(str); } 

Este código realmente utilizará myList.Iterator para el iterador sobre la lista.

se ha agregado el nuevo for loop desde java 5 para facilitar la iteración sobre las colecciones y matrices.

por iterador cada implementación en Java Collection puede tener su propia forma de iteración (List, Set LinkedList, mapa o ....)

se puede implementar esta interfaz en sus clases personalizadas también. para permitir que otro código itere sobre los elementos que tienes dentro de tu objeto.

16

Básicamente, el bucle foreach es un atajo para el uso más común de un iterador. Esto es, iterar a través de todos los elementos. Sin embargo, hay algunas diferencias:

  • Puede recorrer una matriz usando bucle foreach directamente
  • Puede eliminar objetos utilizando un iterador, pero no puede hacerlo con un bucle foreach
  • A veces es útil para pasar un iterador a una función (especialmente las recursivas)
+0

gracias, esto responde mi pregunta. – chronical

2

No creo que haya ningún beneficio de rendimiento en el uso en la mayoría de los casos si solo está iterando sobre collection/array. Pero el uso puede diferir según su caso de uso.

  • Si su caso es única iterando sobre la lista, el uso de for each bucle debe Preffered desde Java 1.5.
  • Pero si su caso está manipulando colección, mientras que la iteración Es necesario utilizar interfaz Iterator.
1

Un iterador es una abstracción sobre cómo se implementa una colección. Le permite revisar toda la colección de a un elemento a la vez, opcionalmente eliminando elementos.

La desventaja de un iterador es que puede ser muy lento si SÍ conoce la implementación subyacente.Por ejemplo, usar un iterador para una ArrayList es considerablemente más lento que simplemente llamar a ArrayList.get (i) para cada elemento. Si esto importa mucho depende de lo que esté haciendo el código.

Cuestiones relacionadas