Javaのfor文は、プログラミングにおける基本的な制御構文の1つであり、繰り返し処理を効率的に記述するために欠かせません。
本記事では、for文の基本構文から、配列・リストを活用した応用例・拡張for文・forEachメソッドの活用・条件式の最適化や省略記法について詳しく解説します。
シンプルなループ処理から高度な最適化までfor文の理解を深め、より効率的なコードを書けるようになりましょう。
目次
1.Javaのfor文とは?
プログラミングにおいて、同じ処理を繰り返し実行することは一般的です。特に大量のデータを扱う場合や、一定の回数で処理を実行する必要がある場合に、ループ処理は欠かせません。
Javaにはfor文・while文・do-while文などのループ制御構文がありますが、その中でもfor文は最も基本的かつ多くの場面で使用されるループ構文です。
for文を使えば、回数を明確に指定したループ処理を簡潔に記述できます。例えば、1から10までの数を順番に出力する場合、for文を使えばわずか3行のコードで実現可能です。
本章ではJavaのfor文の基本構文や動作の仕組みを詳しく解説し、実際のコード例を交えながら、どのように活用できるのかを理解していきます。
for文の基本構文
for文は、指定した回数だけループを繰り返すための制御構文です。その基本構文は以下のようになります。
for (初期化式; 条件式; 更新式) { // 繰り返し実行する処理 } |
初期化式
ループが開始される前に、一度だけ実行される式(例:カウンター変数の宣言)
条件式
ループを継続するための条件(trueの場合ループ継続、falseの場合終了)
更新式
各ループの反復が終わるたびに実行される式(カウンター変数の増減)
この3つの要素を組み合わせることで、for文は柔軟なループ処理を可能にします。
for文の仕組み
for (int i = 0; i < 5; i++) { System.out.println("現在のカウント: " + i); } |
上記のコードは下記のように動作します。
ループ回数 | 初期化式 | 条件式 | 更新式 | 出力 |
---|---|---|---|---|
1回目 | i = 0 | true | i = 1 | 現在のカウント: 0 |
2回目 | i = 1 | true | i = 2 | 現在のカウント: 1 |
3回目 | i = 2 | true | i = 3 | 現在のカウント: 2 |
4回目 | i = 3 | true | i = 4 | 現在のカウント: 3 |
5回目 | i = 4 | true | i = 5 | 現在のカウント: 4 |
6回目 | i = 5 | false | - | - |
このように、iの値が0から4まで増加し、5になった時点でループが終了します。
シンプルな例
次に、1から10までの数値を順番に出力するコードを見てみましょう。
for (int i = 1; i <= 10; i++) { System.out.print(i + " "); } |
このコードのポイントは下記の通りです。
i = 1からスタートし、i <= 10の間ループを繰り返す
i++によってiの値が1ずつ増加する
System.out.print(i + " ");によって、改行せずに1から10まで出力
ネストされたfor文
for文の中にfor文を入れることで、二重ループ(ネストされたループ)を作成できます。これは、多次元配列の処理や表形式データの出力などでよく使われます。
for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 3; j++) { System.out.print("(" + i + ", " + j + ") "); } System.out.println(); } |
このコードのポイントは下記の通りです。
外側のループ(i)は、1回のループごとに1行を出力
内側のループ(j)は、1行の中で3つの値を出力
System.out.println();によって各行を改行
コロンを使ったfor文
通常のfor文ではインデックス(i)を利用して要素を取得しますが、コロン(:)を用いると直接要素を変数に代入できます。
int[] numbers = {10, 20, 30, 40, 50};
System.out.println("数値: " + num); } |
numbersの各要素が、直接numに代入されるため、シンプルな記述が可能です。
2.for文の応用:配列・Listの操作
Javaのfor文は、単なる繰り返し処理だけでなく、配列やListのデータを操作する際に便利です。本章では、for文を用いた配列やListの操作方法を具体的なコードとともに解説します。
配列を使ったfor文の活用
配列(Array)は、同じ型のデータを連続して格納できるデータ構造です。Javaの配列は固定長であり、作成後にサイズを変更することはできません。
配列の要素を1つずつ取り出すには、for文を利用してインデックスを使う方法が一般的です。
public class ForArrayExample { public static void main(String[] args) { int[] numbers = {10, 20, 30, 40, 50}; // 配列の宣言と初期化
System.out.println("配列の要素 [" + i + "] : " + numbers[i]); } } } |
配列へのデータ格納とfor文の活用
for文を利用して配列に値を格納する方法は下記の通りです。
public class ForArrayStore { public static void main(String[] args) { int[] squares = new int[5]; // 要素数5の配列を宣言
for (int i = 0; i < squares.length; i++) { squares[i] = (i + 1) * (i + 1); // 1, 4, 9, 16, 25 を格納 }
for (int i = 0; i < squares.length; i++) { System.out.println("squares[" + i + "] = " + squares[i]); } } } |
このように、for文を利用すると、配列の初期化やデータ格納を効率よく行うことができます。
Listを使ったfor文の活用
Javaには、可変長のデータ構造としてArrayListを含むコレクションフレームワークが提供されています。ArrayListは、要素数が変更可能な配列のように扱える便利なクラスです。
import java.util.ArrayList;
public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); // リストの宣言 names.add("Alice"); names.add("Bob"); names.add("Charlie");
System.out.println("名前 [" + i + "] : " + names.get(i)); } } } |
拡張for文を使った配列・リストの操作
Javaには、拡張for文というシンプルな書き方があり、配列やリストの要素を効率よく操作できます。
for (データ型 変数名 : 配列またはリスト) { // 繰り返し処理 } |
拡張for文は、iなどのループ変数を使わずに記述可能で、可読性が向上するメリットがあります。また、ArrayListやSetなどのコレクションにも対応しています。ただし、要素のインデックスが必要な場合は通常のfor文の方が適しているため、注意が必要です。
配列に対する拡張for文の例
配列に対する拡張for文は下記のように記述します。
public class EnhancedForArray { public static void main(String[] args) { int[] numbers = {10, 20, 30, 40, 50};
System.out.println("数値: " + num); } } } |
リストに対する拡張for文の例
リストに対する拡張for文は下記のように記述します。
import java.util.ArrayList;
public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie");
System.out.println("名前: " + name); } } } |
関連記事
JavaのList初期化ガイド|初期化の方法や実装事例、addできない理由なども解説
3.forEach文(ラムダ式を活用したループ処理)
Java 8以降では、従来のfor文や拡張for文に加えて、forEachメソッドが導入されました。forEachはラムダ式を活用して、よりシンプルにコレクションの要素を処理できます。
本章では、forEach文の基本構文や使用例、従来のfor文との違いについて詳しく解説します。
forEach文とは?
forEach文は、コレクション(ListやSet)の要素を簡潔に処理できるメソッドです。
主にArrayListなどのIterableを継承したクラスで利用されます。基本構文は下記の通りです。
list.forEach(要素 -> 処理); |
forEach文の具体的な使用例
forEach文は、ListやSet、Mapなどのコレクションに対して簡潔にループ処理を行うことができる便利なメソッドです。従来のfor文や拡張for文と異なり、ラムダ式を活用することで可読性が向上し、より直感的なコードが書けるのが特徴です。
ArrayListをforEachで処理する
ArrayListをforEachで処理する場合、下記のように記述します。
import java.util.ArrayList;
public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie");
names.forEach(name -> System.out.println("名前: " + name)); } } |
メソッド参照を使ったforEach
ラムダ式を使わず、メソッド参照を利用するとさらにシンプルに書けます。
import java.util.ArrayList;
public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie");
names.forEach(System.out::println); } } |
forEachと従来のfor文の違い
forEachは、ListやMapなどのコレクションに対して直接適用でき、ラムダ式を活用することでコードの可読性を向上させるのが特徴です。
しかし、すべてのケースにおいてforEachが最適とは限りません。
例えば、ループのインデックスを取得したい場合や、要素の値を変更したい場合には、従来のfor文の方が適していることもあります。
for文 | 拡張for文 | forEach | |
---|---|---|---|
コレクション対応 | 可能 | 可能 | 可能 |
配列対応 | 可能 | 可能 | 可能 |
可読性 | 標準 | 向上 | 向上 |
インデックス取得 | 可能 | 不可 | 不可 |
要素の変更 | 可能 | 不可 | 不可 |
関連記事
【2025年版】Javaの最新バージョン|確認方法やインストール方法を解説
4.Java for文の条件式を最適化する方法
for文の条件式は、ループ処理のパフォーマンスやコードの可読性に大きな影響を与えます。不適切な条件式を設定すると、無駄な計算が発生したり、意図しないバグを引き起こしたりする可能性があります。
本章では、for文の条件式を最適化するためのテクニックを具体的なコード例とともに解説します。
条件式の基本とループ処理の流れ
for文の基本構文では、条件式がtrueの間だけループが実行されます。
for (初期化式; 条件式; 更新式) { // 繰り返し処理 } |
例えば、以下のコードではi < 10がtrueの間、ループが継続されます。
for (int i = 0; i < 10; i++) { System.out.println(i); } |
しかし、条件式の記述方法によっては処理速度やメモリ使用量に影響を及ぼすため、最適化が必要です。
条件式の最適化
for文の条件式は、ループの実行回数やパフォーマンスに直接影響を与える重要な要素です。適切に条件式を設計しないと、不要な計算が発生したり、ループが期待通りに終了しなかったりすることがあります。for文の条件式を最適化するための具体的な例を紹介します。
配列やリストのサイズ取得をループ外に出す
NG例
int[] numbers = {1, 2, 3, 4, 5}; for (int i = 0; i < numbers.length; i++) { // ← 毎回 length を取得する System.out.println(numbers[i]); } |
改善例
int[] numbers = {1, 2, 3, 4, 5}; int length = numbers.length; // ループ外で取得 for (int i = 0; i < length; i++) { System.out.println(numbers[i]); } |
numbers.lengthは配列の場合フィールドアクセスであり計算コストは低いですが、毎回参照が発生します。事前にlength変数へ格納すれば、ループ内のオーバーヘッドを削減できます。
逆順ループは>を使う
リストの要素を逆順に処理する場合、条件式の最適化が重要です。
NG例
for (int i = list.size() - 1; i >= 0; i--) { // ループのたびに size() を呼び出す System.out.println(list.get(i)); } |
改善例
int size = list.size(); for (int i = size - 1; i >= 0; i--) { // size() の呼び出しを削減 System.out.println(list.get(i)); } |
list.size()を毎回計算せず、事前にsizeに格納することでパフォーマンス向上します。また、i > -1よりi >= 0の方が直感的で可読性が高くなります。
条件式の評価順を最適化
複数の条件を使う場合、評価の順序を考慮するとパフォーマンスが向上します。
NG例
for (int i = 0; i < numbers.length && checkCondition(i); i++) { System.out.println(numbers[i]); } |
改善例
for (int i = 0; i < numbers.length; i++) { if (!checkCondition(i)) break; // 条件が false なら即終了 System.out.println(numbers[i]); } |
checkCondition(i)の計算コストが高い場合、毎回の評価を回避することで最適化しています。また、breakを使うことで、無駄なループの実行を防ぎます。
関連記事
Javaのboolean型とは?if文の使い方や初期値・0/1・戻り値・参照渡しなど条件分岐方法を解説!
5.for文の省略記法
Javaのfor文は構文の一部を省略したり、短縮形を活用することで、コードを簡潔に記述できるようになっています。しかし、むやみに省略すると可読性が低下することもあるため、適切な場面で活用することが重要です。
通常のfor文は下記のようなコードになります。
for (int i = 0; i < 5; i++) { System.out.println(i); } |
一部を省略する際のパターンとその記述例は下記の通りです。
省略形 | 省略される部分 | 例 |
---|---|---|
初期化式の省略 | ループ開始前の変数を事前に宣言 | int i = 0; for (; i < 5; i++) {} |
条件式の省略 | 無限ループを作成 | for (int i = 0;; i++) {} |
更新式の省略 | ループ内部でカウント更新 | for (int i = 0; i < 5;) { i++; } |
全て省略(無限ループ) | 全ての要素を省略し、breakで抜ける | for (;;) { break; } |
関連記事
Javaプログラミングで何ができる?始め方や基本文法、練習サイト5つを紹介
6.まとめ
本記事では、Javaのfor文について基本構文から応用的な活用方法まで詳しく解説しました。配列やリストの操作には通常のfor文だけでなく、拡張for文やforEachメソッドを活用することで、コードの可読性を向上できます。
また条件式の最適化やfor文の省略記法を適切に使うことで、パフォーマンスを向上させ、無駄な計算を削減できます。用途に応じた最適なループ処理を選択し、効率的なコーディングを心がけましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。