O clássico loop for de três partes
Um loop for repete um bloco um número controlado de vezes. A forma do Java junta três coisas dentro dos parênteses, separadas por ponto e vírgula:
As três partes rodam num ritmo fixo:
- Inicialização (
int i = 0) - roda uma vez, antes de tudo. - Condição (
i < 5) - verificada antes de cada passagem; o loop para quando ela é falsa. - Atualização (
i++) - roda após cada passagem, antes de a condição ser verificada de novo.
Então isso imprime de i = 0 até i = 4. O contador i tem escopo restrito ao loop - ele não existe depois da chave de fechamento.
Contar para cima, para baixo e em passos
As três partes te dão controle total sobre o contador:
i-- decrementa, i += 5 salta em passos de cinco. A condição decide a parada conforme a direção: use > ao contar para baixo, e < ou <= ao contar para cima.
Percorrer um array
Um loop contado combina naturalmente com um array, usando .length como limite e i como índice:
Repare que colors.length é um campo sem parênteses - os arrays são especiais nesse ponto. Uma List, por sua vez, usa list.size(). A condição i < colors.length está correta: os índices vão de 0 a length - 1, então usar < (e não <=) evita um erro de fora dos limites.
O loop for-each aprimorado
Quando você só precisa de cada elemento e nunca do índice, o for aprimorado é mais limpo e mais difícil de errar - não há contador para um erro de off-by-one:
Leia for (String color : colors) como "para cada color em colors". Funciona com arrays e qualquer coisa iterável. O custo: você não tem índice e não pode adicionar nem remover da coleção enquanto a percorre (isso lança ConcurrentModificationException). Recorra ao loop contado quando precisar de qualquer um dos dois.
Loops aninhados
Um loop dentro de outro loop - útil para grades, tabelas e pares. O loop interno roda por completo a cada passagem do externo:
Isso imprime uma grade de multiplicação 3x3. Dê aos contadores nomes significativos (row, col) em vez de i, j quando o aninhamento ficar profundo - isso evita que você confunda qual é qual.
break e continue
break sai do loop imediatamente. continue pula o resto da passagem atual e salta para o passo de atualização:
Isso imprime 1 3 5 7. continue pula os pares; break encerra o loop assim que i ultrapassaria 7. Em loops aninhados, ambos afetam apenas o loop mais interno, a menos que você use um break rotulado.
Cuidado com loops infinitos
Se a condição nunca ficar falsa, o loop roda para sempre. A causa comum é esquecer a atualização ou mover o contador na direção errada:
for (int i = 0; i < 5; i--) { // i só diminui -> nunca chega a 5
System.out.println(i);
}
Um loop infinito intencional omite as três partes -for (;;) { ... }- e conta com um break interno para parar. Use com moderação; um while (true) costuma ser mais claro de ler.
Próximo: loops while
O loop for brilha quando você conhece o contador de antemão. Quando você quer iterar até que alguma condição mude - e não tem um contador claro -, o loop while se encaixa melhor. Essa é a próxima página.
Perguntas frequentes
Qual é a sintaxe de um loop for em Java?
Um loop for em Java tem três partes entre parênteses separadas por ponto e vírgula: for (inicialização; condição; atualização) { ... }. Por exemplo, for (int i = 0; i < 5; i++) { ... } começa i em 0, executa o corpo enquanto i < 5 e soma 1 a i após cada passagem. As três partes são opcionais.
Qual é a diferença entre um loop for e um loop for-each em Java?
O loop for clássico usa um contador explícito, então você controla o índice e a direção - ideal quando você precisa do índice ou quer pular elementos. O for-each aprimorado, for (Tipo item : coleção), percorre cada elemento em ordem sem índice - mais limpo quando você só precisa de cada elemento e nunca da posição. O for-each não consegue modificar a estrutura da coleção enquanto itera.
Como percorrer um array em Java?
Indexe-o com um loop contado -for (int i = 0; i < arr.length; i++) { use arr[i]; }- ou, quando não precisar do índice, use um for-each: for (int x : arr) { use x; }. Os arrays expõem seu tamanho pelo campo .length (sem parênteses), enquanto as listas usam .size().