Iteración

for clásico, for-each y while

for clásico

El for de tres partes (inicialización; condición; actualización). Útil cuando necesitas el índice, recorrer en sentido inverso, o incrementar de forma no lineal.

// for clásico: cuando necesitas el índice o control preciso del contador
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

// Recorrer array con índice
int[] numeros = {10, 20, 30, 40};
for (int i = 0; i < numeros.length; i++) {
    System.out.println("numeros[" + i + "] = " + numeros[i]);
}

// Puede ser cualquier expresión de control
for (int i = numeros.length - 1; i >= 0; i--) { // recorrido inverso
    System.out.println(numeros[i]);
}

for-each (enhanced for)

Sintaxis más legible para recorrer cualquier Iterable (incluyendo todas las colecciones) o array. Preferible al for clásico siempre que no se necesite el índice ni modificar la estructura.

// for-each (enhanced for): para cualquier Iterable o array
// Más legible que el for clásico cuando no necesitas el índice

List<String> nombres = Arrays.asList("Ana", "Luis", "Eva");

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

// También funciona con arrays
for (int n : numeros) {
    System.out.println(n);
}

// Limitación: no permite modificar la colección durante la iteración
// ni obtener el índice directamente

while y do-while

while evalúa la condición antes de ejecutar el cuerpo: puede no ejecutarse nunca. do-while ejecuta el cuerpo al menos una vez, luego evalúa la condición. Se usan cuando el número de iteraciones depende de una condición externa, no de un contador.

// while: cuando no se sabe de antemano cuántas iteraciones habrá
Scanner sc = new Scanner(System.in);
String entrada = "";

while (!entrada.equals("salir")) {
    System.out.print("Escribe algo ('salir' para terminar): ");
    entrada = sc.nextLine();
    System.out.println("Escribiste: " + entrada);
}

// do-while: ejecuta al menos una vez antes de comprobar la condición
int intentos = 0;
do {
    intentos++;
    System.out.println("Intento " + intentos);
} while (intentos < 3);

break y continue

// break: sale del bucle inmediatamente
// continue: salta a la siguiente iteración

List<Integer> valores = Arrays.asList(1, 3, -5, 7, 2, -1, 8);

// Encontrar el primer negativo
for (int v : valores) {
    if (v < 0) {
        System.out.println("Primer negativo: " + v);
        break; // sale del bucle
    }
}

// Saltar negativos
for (int v : valores) {
    if (v < 0) continue; // salta al siguiente elemento
    System.out.println(v); // solo imprime los positivos
}

// break con label: para salir de bucles anidados (uso raro)
externo:
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        if (i * j > 6) break externo; // sale de ambos bucles
    }
}
Guía de elección: usa for-each por defecto. Usa for clásico cuando necesites el índice. Usa while cuando la condición de parada es externa al contador. En Java 8, considera Stream.forEach() o stream().filter().map() como alternativa funcional para transformaciones.

Siguiente apartado → Entrada y salida estándar: Scanner y System.out

Índice de la sección

Índice del curso