Iterador de Java con ejemplos

  • Autor de la entrada:
  • Categoría de la entrada:Java
  • Comentarios de la entrada:Sin comentarios

El iterador se utiliza para iterar (looping) varias clases de colecciones como HashMap, ArrayList, LinkedList etc. En este tutorial, aprenderemos qué es el iterador, cómo usarlo y cuáles son los problemas que pueden surgir al usarlo. El iterador tuvo lugar de la Enumeración, que se utilizó para iterar clases de legado como Vector. También veremos las diferencias entre Iterator y Enumeración en este tutorial.

Ejemplo de Iterator sin genéricos

Los genéricos se introdujeron en Java 5. Antes de eso no había ningún concepto de Genéricos.

importar java.util.ArrayList;importar java.util.Iterator; clase pública 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); } } }

Salida:

ChaitanyaSteveJack

En el ejemplo anterior hemos iterado ArrayList sin usar Genéricos. El programa funcionó bien sin problemas, sin embargo puede haber una posibilidad de ClassCastException si no se usan Genéricos (lo veremos en la siguiente sección).

Léelos también:
Cómo iterar HashMap
Cómo iterar LinkedList

Ejemplo de Iterator con Genéricos

En la sección anterior discutimos sobre ClassCastException. Veamos qué es y por qué ocurre cuando no usamos Genéricos.

importar java.util.ArrayList;importar 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"); /Añadiendo el valor de Integer a String ArrayList names.add(new Integer(10)); Iterator it = names.iterator(); while(it.hasNext()) { String obj = (String)it.next(); System.out.println(obj); } }}

Salida:

ChaitanyaExcepción en el hilo "main" SteveJackjava.lang.ClassCastExcepción: java.lang.Integer no puede ser lanzado a java.lang.String en beginnersbook.com.Details.main(Details.java:18)

En el programa anterior intentamos añadir el valor Integer a la ArrayList de String pero no obtuvimos ningún error de tiempo de compilación porque no usamos Generics. Sin embargo, como tecleamos el valor integer a String en el bucle while, obtuvimos ClassCastException.

Usar Generics:
Aquí estamos usando Generics por lo que no tecleamos caste la salida. Si intentas añadir un valor entero a ArrayList en el siguiente programa, obtendrás un error de tiempo de compilación. De esta manera podemos evitar ClassCastException.

importar java.util.ArrayList;importar java.util.Iterator; public class IteratorDemo3 { public static void main(String args[]){ ArrayList<String> names = new ArrayList<String>(); names.add("Chaitanya"); nombres.add("Steve"); nombres.add("Jack"); Iterator<Cadena> it = nombres.iterator(); while(it.hasNext()) { String obj = it.next(); System.out.println(obj); } }}

Nota: No hemos escrito cast iterator returned value[it.next()]] ya que no es necesario cuando se usa Generics.

Diferencia entre Iterator y Enumeración

Un iterador sobre una colección. El iterador toma el lugar de la Enumeración en el Marco de Colecciones de Java. Los iteradores difieren de las enumeraciones de dos maneras:
1) Los iteradores permiten al llamante eliminar elementos de la colección subyacente durante la iteración con una semántica bien definida.
2) Se han mejorado los nombres de los métodos. El método hashNext() del iterador ha sido reemplazado por el método de enumeración MoreElements(), de manera similar next() reemplazó a nextElement().

Modificación ConcurrenteExcepción mientras se usa el Iterator

importar 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); //Estamos añadiendo el elemento mientras iteramos la lista books.add("C++"); } }}

Salida:

CExcepción en el hilo "principal" java.util.ConcurrentModificationExcepción en java.util.ArrayList$Itr.checkForComodification(Unknown Source) en java.util.ArrayList$Itr.next(Unknown Source) en beginnersbook.com.Details.main(Details.java:12)

No podemos añadir o quitar elementos a la colección mientras usamos el iterador sobre ella.

Explicación de Javadoc:
Esta excepción puede ser lanzada por métodos que han detectado la modificación concurrente de un objeto cuando dicha modificación no es permisible.
Por ejemplo, generalmente no se permite que un hilo modifique una Colección mientras otro hilo está iterando sobre ella. En general, los resultados de la iteración no se definen en estas circunstancias. Algunas implementaciones de Iterator (incluyendo las de todas las implementaciones de colecciones de propósito general proporcionadas por el JRE) pueden elegir lanzar esta excepción si se detecta este comportamiento. Los iteradores que hacen esto se conocen como iteradores rápidos, ya que fallan rápida y limpiamente, en lugar de arriesgarse a un comportamiento arbitrario y no determinante en un momento indeterminado en el futuro.

Deja una respuesta