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:
- Inicialização — executada uma vez, antes do loop começar. Normalmente declara o contador.
- Condição — verificada antes de cada iteração. Se falsa, o loop termina.
- 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 hereIsso é 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
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.