Saltar a contenido

📚 Iteradores en Java (Iterator y ListIterator)

Después de aprender List, ArrayList y LinkedList, necesitamos una forma segura y estándar de recorrer colecciones.
Para eso Java proporciona los iteradores.


🔁 ¿Qué es un Iterator?

Un iterador es un objeto que permite recorrer los elementos de una colección uno a uno.

La interfaz principal es:

Iterator<E>

📌 Permite recorrer colecciones como:

  • ArrayList
  • LinkedList
  • HashSet
  • TreeSet

⚙️ Métodos principales de Iterator

Método Qué hace
hasNext() Indica si quedan elementos
next() Devuelve el siguiente elemento
remove() Elimina el último elemento devuelto

🧪 Ejemplo básico

import java.util.*;

public class EjemploIterator {

    public static void main(String[] args) {

        List<String> nombres = new ArrayList<>();

        nombres.add("Ana");
        nombres.add("Luis");
        nombres.add("Pedro");

        Iterator<String> it = nombres.iterator();

        while (it.hasNext()) {
            String nombre = it.next();
            System.out.println(nombre);
        }
    }
}

Salida:

Ana
Luis
Pedro


🧠 Cómo funciona internamente

El iterador mantiene una posición interna en la colección.

[Ana][Luis][Pedro]

posición actual

Cada vez que llamamos a next():

1️⃣ devuelve el elemento actual
2️⃣ avanza al siguiente


❗ Error común al recorrer colecciones

❌ Incorrecto:

for(String nombre : nombres){
    if(nombre.equals("Luis")){
        nombres.remove(nombre);
    }
}

Provoca:

ConcurrentModificationException --> indica que has modificado (add/remove) una colección mientras la estabas recorriendo de una forma no permitida.


✅ Forma correcta con Iterator

Si quieres eliminar un ítem de una colección mientras la recorres, usa el propio iterador:

Iterator<String> it = nombres.iterator();

while(it.hasNext()){

    String nombre = it.next();

    if(nombre.equals("Luis")){
        it.remove();
    }
}

Esto es seguro porque el iterador controla las modificaciones.


🔄 for-each usa internamente un Iterator

for(String nombre : nombres){
    System.out.println(nombre);
}

Internamente Java hace algo parecido a:

Iterator<String> it = nombres.iterator();

while(it.hasNext()){
    String nombre = it.next();
}

🔁 ListIterator

Las listas (List) tienen un iterador más avanzado:

ListIterator

Solo funciona con:

  • ArrayList
  • LinkedList

⭐ Ventajas de ListIterator

Permite:

✔ recorrer la lista hacia delante y hacia atrás
modificar elementos
insertar elementos durante el recorrido


⚙️ Métodos principales

Método Qué hace
hasNext() Hay siguiente elemento
next() Devuelve siguiente
hasPrevious() Hay elemento anterior
previous() Devuelve anterior
remove() Elimina el último elemento devuelto
add(E e) Inserta elemento
set(E e) Modifica elemento actual

🧪 Ejemplo con ListIterator

List<String> nombres = new ArrayList<>();

nombres.add("Ana");
nombres.add("Luis");
nombres.add("Pedro");

ListIterator<String> it = nombres.listIterator();

while(it.hasNext()){
    System.out.println(it.next());
}

🔁 Recorrer la lista hacia atrás

while(it.hasPrevious()){
    System.out.println(it.previous());
}

➕ Insertar elementos durante el recorrido

ListIterator<String> it = nombres.listIterator();

while(it.hasNext()){

    String nombre = it.next();

    if(nombre.equals("Luis")){
        it.add("Carlos");
    }
}

Resultado:

[Ana, Luis, Carlos, Pedro]


🧠 Resumen

Método Iterator ListIterator
Tipo de colecciones Cualquier colección (List, Set, etc.) Solo List
hasNext()
next()
remove()
add()
set()
previous()

💡 Idea clave

Todas las colecciones se pueden recorrer con iteradores.

Iterator permite recorrer y borrar; ListIterator además permite insertar, modificar y retroceder.