Bucle for en Java
Itera un número fijo de veces en Java con el bucle for: inicialización, condición y expresiones de actualización explicadas con ejemplos.
El bucle for es el motor de la iteración en Java. Agrupa tres partes — qué hacer antes del bucle, qué comprobar antes de cada iteración, y qué hacer después de cada iteración — en una sola cabecera. El resultado es más compacto y menos propenso a errores que escribir lo mismo con while.
Sintaxis
for (initialization; condition; update) {
// body
}Tres partes separadas por punto y coma:
- Inicialización — se ejecuta una sola vez, antes de que comience el bucle. Generalmente declara el contador.
- Condición — se comprueba antes de cada iteración. Si es falsa, el bucle termina.
- Actualización — se ejecuta después de cada iteración. Generalmente incrementa el contador.
for (int i = 0; i < 5; i++) {
System.out.println(i);
}Imprime 0 1 2 3 4. La cabecera se lee así: empieza con i = 0, ejecuta mientras i < 5, incrementa i cada vez.
Forma equivalente con while
Un bucle for es mecánicamente equivalente a este while:
{
int i = 0; // initialization
while (i < 5) { // condition
System.out.println(i);
i++; // update
}
}La ventaja de for es que todo lo que controla el bucle vive en una sola línea, lo que hace evidente la intención de un vistazo.
Variaciones de conteo
La cabecera del for es flexible. Las tres partes pueden ser cualquier cosa:
// counting down
for (int i = 10; i > 0; i--) { ... }
// stepping by 2
for (int i = 0; i < 100; i += 2) { ... }
// looping over an array by index
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}Si no necesitas una parte en particular, puedes omitirla, pero mantén los puntos y coma:
for (;;) { // identical to while (true)
if (done()) break;
}El error de desplazamiento en uno
El error más común en los bucles for es elegir el operador de comparación equivocado. Al indexar un array de longitud n, los índices válidos van de 0 a n - 1, por lo que la condición debe ser i < n (no i <= n):
int[] arr = {10, 20, 30}; // length 3, indices 0..2
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]); // throws ArrayIndexOutOfBoundsException when i == 3
}Reemplazar <= por < lo corrige. Una regla sencilla: usa < con un conteo o length, y reserva <= para un último valor explícito (p. ej. for (int i = 1; i <= 5; i++)).
Ámbito de la variable de bucle
Una variable declarada en la cláusula de inicialización es local al bucle. Una vez que el bucle termina, deja de existir:
for (int i = 0; i < 5; i++) {
// i is visible here
}
// i is not visible hereEsto es intencional — evita que dependas accidentalmente del valor final del contador. Si necesitas el valor fuera del bucle, decláraloo antes:
int i;
for (i = 0; i < 5; i++) {
if (someCondition(i)) break;
}
System.out.println("stopped at i=" + i);Múltiples variables en una cabecera
Puedes declarar y actualizar más de una variable, separadas por comas:
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println(i + " " + j);
}Útil en ocasiones, pero si un bucle necesita más de dos variables que interactúan entre sí, generalmente es señal de refactorizar en partes más pequeñas.
Cuándo elegir for en lugar de while
Usa un bucle for cuando sabes — o puedes expresar en una línea — cuántas iteraciones necesitas o qué rango vas a recorrer. Usa un bucle while cuando la condición de parada está desligada de un contador (p. ej. "hasta que se acabe la entrada", "hasta que se logre el éxito").
Para recorrer elemento a elemento un array o una colección, el bucle for-each mejorado es casi siempre más limpio.
Un ejemplo práctico
Qué viene después
Cuando solo quieres visitar cada elemento de un array o colección sin gestionar un índice, el bucle for-each es la herramienta adecuada.