W3docs

Java for Loop

Itere um número fixo de vezes em Java com o loop for — inicialização, condição e expressões de atualização.

O loop for é o principal mecanismo de iteração do Java. Ele reúne três partes — o que fazer antes do loop, o que verificar antes de cada iteração e o que fazer após cada iteração — em um único cabeçalho. O resultado é mais compacto e menos propenso a erros do que a mesma lógica escrita com while.

Sintaxe

for (initialization; condition; update) {
  // body
}

Três partes separadas por ponto e vírgula:

  1. Inicialização — executada uma vez, antes do loop começar. Normalmente declara o contador.
  2. Condição — verificada antes de cada iteração. Se falsa, o loop termina.
  3. Atualização — executada após cada iteração. Normalmente incrementa o contador.
for (int i = 0; i < 5; i++) {
  System.out.println(i);
}

Imprime 0 1 2 3 4. O cabeçalho é lido como: comece com i = 0, execute enquanto i < 5, incremente i a cada vez.

Forma equivalente com while

Um loop for é mecanicamente equivalente a este while:

{
  int i = 0;            // initialization
  while (i < 5) {       // condition
    System.out.println(i);
    i++;                // update
  }
}

A vantagem do for é que tudo que controla o loop fica em uma única linha, tornando a intenção evidente à primeira vista.

Variações de contagem

O cabeçalho do for é flexível. As três partes podem ser qualquer coisa:

// 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]);
}

Se você não precisar de uma parte específica, deixe-a em branco — mas mantenha os ponto e vírgulas:

for (;;) {              // identical to while (true)
  if (done()) break;
}

O erro de off-by-one

O bug mais comum em loops for é escolher o operador de comparação errado. Ao indexar um array de comprimento n, os índices válidos vão de 0 a n - 1, então a condição deve ser i < n (não 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
}

Substituir <= por < corrige o problema. Uma regra simples: use < com uma contagem ou length, e reserve <= para um último valor explícito (ex.: for (int i = 1; i <= 5; i++)).

Escopo da variável de loop

Uma variável declarada na cláusula de inicialização é local ao loop. Após o término do loop, ela deixa de existir:

for (int i = 0; i < 5; i++) {
  // i is visible here
}
// i is not visible here

Isso é intencional — impede que você acidentalmente dependa do valor final do contador. Se precisar do valor fora do loop, declare-o antes:

int i;
for (i = 0; i < 5; i++) {
  if (someCondition(i)) break;
}
System.out.println("stopped at i=" + i);

Múltiplas variáveis em um único cabeçalho

Você pode declarar e atualizar mais de uma variável, separadas por vírgulas:

for (int i = 0, j = 10; i < j; i++, j--) {
  System.out.println(i + " " + j);
}

Útil ocasionalmente — mas se um loop precisar de mais de duas variáveis interagindo, geralmente é um sinal para refatorar em partes menores.

Quando escolher for em vez de while

Use um loop for quando souber — ou puder expressar em uma linha — quantas iterações são necessárias ou qual intervalo está percorrendo. Use um loop while quando a condição de parada não estiver associada a um contador (ex.: "até que a entrada acabe", "até ter sucesso").

Para percorrer um array ou coleção elemento a elemento, o loop for-each aprimorado é quase sempre mais limpo.

Um exemplo prático

java— editable, runs on the server

O que vem a seguir

Quando você apenas quer visitar cada elemento de um array ou coleção sem gerenciar um índice, o loop for-each é a ferramenta certa.

Prática

Prática
O que é impresso por for (int i = 0; i < 5; i += 2) System.out.print(i); ?
O que é impresso por for (int i = 0; i < 5; i += 2) System.out.print(i); ?
Was this page helpful?