📚 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.
Iteratorpermite recorrer y borrar;ListIteratorademás permite insertar, modificar y retroceder.