W3docs

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:

  1. Inicialización — se ejecuta una sola vez, antes de que comience el bucle. Generalmente declara el contador.
  2. Condición — se comprueba antes de cada iteración. Si es falsa, el bucle termina.
  3. 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 here

Esto 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

java— editable, runs on the server

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.

Práctica

Práctica
¿Qué imprime for (int i = 0; i < 5; i += 2) System.out.print(i); ?
¿Qué imprime for (int i = 0; i < 5; i += 2) System.out.print(i); ?
Was this page helpful?