El iterador se utiliza para iterar (bucle) varias clases de colección como HashMap, ArrayList, LinkedList, etc. En este tutorial aprenderemos qué es el iterador, cómo usarlo y qué problemas pueden surgir al usarlo. El iterador tuvo lugar la enumeración, que se usó para iterar clases heredadas como Vector. También veremos las diferencias entre Iterator y Enumeration en este tutorial.
Ejemplo de un iterador sin genéricos
Los genéricos se introdujeron en Java 5. Antes no existía el concepto de genéricos.
import java.util.ArrayList; import java.util.Iterator; public class IteratorDemo1 { public static void main(String args[]){ ArrayList names = new ArrayList(); names.add("Chaitanya"); names.add("Steve"); names.add("Jack"); Iterator it = names.iterator(); while(it.hasNext()) { String obj = (String)it.next(); System.out.println(obj); } } }
Producción:
Chaitanya Steve Jack
En el ejemplo anterior iteramos ArrayList sin usar Generics. El programa funcionó correctamente sin problemas, sin embargo, puede haber una posibilidad de ClassCastException
si no usa Genéricos (lo veremos en la siguiente sección).
Léelos también:
Cómo iterar HashMap
Cómo iterar LinkedList
Ejemplo de iterador con genéricos
En la sección anterior discutimos ClassCastException. Veamos qué es y por qué ocurre cuando no usamos genéricos.
import java.util.ArrayList; import java.util.Iterator; public class IteratorDemo2 { public static void main(String args[]){ ArrayList names = new ArrayList(); names.add("Chaitanya"); names.add("Steve"); names.add("Jack"); //Adding Integer value to String ArrayList names.add(new Integer(10)); Iterator it = names.iterator(); while(it.hasNext()) { String obj = (String)it.next(); System.out.println(obj); } } }
Producción:
ChaitanyaException in thread "main" Steve Jack java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at beginnersbook.com.Details.main(Details.java:18)
En el programa anterior, intentamos agregar el valor Integer a String ArrayList, pero no obtuvimos ningún error de tiempo de compilación porque no usamos Generics. Sin embargo, dado que escribimos el valor entero lanzado a String en el ciclo while, obtuvimos ClassCastException.
Utilice genéricos:
Aquí estamos usando genéricos, por lo que no hemos escrito caste la salida. Si intenta agregar un valor entero a ArrayList en el siguiente programa, obtendrá un error en tiempo de compilación. De esta forma podemos evitar ClassCastException.
import java.util.ArrayList; import java.util.Iterator; public class IteratorDemo3 { public static void main(String args[]){ ArrayList<String> names = new ArrayList<String>(); names.add("Chaitanya"); names.add("Steve"); names.add("Jack"); Iterator<String> it = names.iterator(); while(it.hasNext()) { String obj = it.next(); System.out.println(obj); } } }
Nota: No escribimos el valor devuelto por el iterador de conversión.[it.next()] ya que no es necesario cuando se utilizan genéricos.
Diferencia entre iterador y enumeración
A iterador en una colección. El iterador ocupa el lugar de la enumeración en el marco de colecciones de Java. Los iteradores se diferencian de las enumeraciones de dos maneras:
1) Los iteradores permiten al llamador eliminar elementos de la colección subyacente cuando se itera con semántica bien definida.
2) Se han mejorado los nombres de los métodos. El método hashNext () del iterador reemplazó al método de enumeración hasMoreElements (), igualmente next () reemplazó a nextElement ().
ConcurrentModificationException al usar Iterator
import java.util.ArrayList; public class ExceptionDemo { public static void main(String args[]){ ArrayList<String> books = new ArrayList<String>(); books.add("C"); books.add("Java"); books.add("Cobol"); for(String obj : books) { System.out.println(obj); //We are adding element while iterating list books.add("C++"); } } }
Producción:
C Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at beginnersbook.com.Details.main(Details.java:12)
No puede agregar o quitar elementos a la colección mientras usa el iterador en ella.
Explicación de Javadoc:
Esta excepción puede ser lanzada por métodos que han detectado la modificación simultánea de un objeto cuando dicha modificación no está permitida.
Por ejemplo, generalmente no está permitido que un hilo modifique una colección mientras otro hilo está iterando a través de ella. En general, los resultados de la iteración no se definen en estas circunstancias. Algunas implementaciones de Iterator (incluidas las de todas las implementaciones de colecciones genéricas proporcionadas por el JRE) pueden optar por lanzar esta excepción si se encuentra este comportamiento. Los iteradores que hacen esto se conocen como iteradores de falla rápida, ya que fallan rápida y limpiamente, en lugar de arriesgarse a un comportamiento arbitrario y no determinista en algún lugar en el futuro.