配列初期化の全体像
配列の初期化は「配列オブジェクトを作る」と「要素に初期値を入れる」の2ステップです。Java の配列は長さが固定で、生成直後は型に応じたデフォルト値(数値は 0、boolean は false、参照型は null)が入ります。用途に応じて「サイズだけ決める」「値を並べて即代入」「後からプログラムで埋める」を使い分けます。
生成だけの初期化(デフォルト値の理解)
サイズ指定で配列を作る
int[] nums = new int[3]; // {0, 0, 0}
boolean[] flags = new boolean[2]; // {false, false}
String[] names = new String[2]; // {null, null}
Java生成した時点で全要素が「型のデフォルト値」になります。参照型(String など)は null から始まるため、使う前に null チェックを入れるか、最初に有効な値で埋める設計にすると安全です。
リテラルで即初期化(読みやすさと安全性)
並べた値で一気に初期化
int[] nums = {10, 20, 30};
String[] fruits = {"apple", "banana", "cherry"};
char[] letters = {'J', 'A', 'V', 'A'};
Java見た目どおりに値が入り、サイズは並べた数で自動決定されます。サイズ指定との併用はできません(new int[3]{...} のような書き方は不可)。宣言と代入を分けたい場合は「ブロック初期化」を使います。
int[] nums;
nums = new int[] {10, 20, 30}; // 分割しても OK
Java多次元配列の初期化(配列の配列)
行列のように書ける初期化
int[][] m = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println(m[1][2]); // 6
Java2次元は「配列の配列」なので、行ごとに長さの異なるジャグ配列も可能です。サイズ指定で作る場合は「外側→内側」の順に生成します。
int[][] jag = new int[3][];
jag[0] = new int[1];
jag[1] = new int[2];
jag[2] = new int[4];
Javaプログラムで埋める初期化(ループ・ユーティリティ)
ループで値を計算しながら入れる
int n = 5;
int[] squares = new int[n];
for (int i = 0; i < n; i++) {
squares[i] = i * i;
}
Java「位置によって値が決まる」「入力を加工して入れる」ような場面では、サイズだけ作ってからループで埋めるのが定石です。
ユーティリティで一括初期化・生成
import java.util.Arrays;
int[] a = new int[4];
Arrays.fill(a, 42); // {42, 42, 42, 42}
int[] b = Arrays.copyOf(a, 6); // 長さ 6 に拡張(余りは 0)
int[] c = new int[5];
Arrays.setAll(c, i -> i + 1); // {1, 2, 3, 4, 5}
Java「同じ値で埋めたい」「長さを変えたい」「添字から計算して埋めたい」などを簡潔に書けます。copyOf は新しい配列を作るため、元配列とは独立です。
重要ポイントの深掘り:null と空配列、固定長の設計
null と空配列の意味の違い
String[] names = null; // 「まだ配列自体が存在しない」
String[] empty = new String[0]; // 「要素数 0 の配列(存在している)」
JavaAPI 設計や条件分岐では「未初期化(null)」と「空だけど有効(長さ 0)」を区別する方が安全です。受け側は null を許容しない設計にすると、分岐が減って扱いやすくなります。
長さは不変(増やすなら新規配列)
int[] a = {1, 2, 3};
// a.length = 5; // NG(読み取り専用)
int[] bigger = Arrays.copyOf(a, 5); // {1, 2, 3, 0, 0}
Java配列は固定長です。頻繁に追加・削除するなら ArrayList の方が適材適所になります。
実用例で身につける
宣言・生成・初期化の段階的な流れ
public class InitSteps {
public static void main(String[] args) {
int[] scores; // 宣言(参照)
scores = new int[3]; // 生成({0,0,0})
scores[0] = 80; // 要素代入
scores[1] = 90;
scores[2] = 75;
System.out.println(scores[1]); // 90
}
}
Java初期化リテラルで即、安全に使う
public class LiteralInit {
public static void main(String[] args) {
String[] fruits = {"apple", "banana", "cherry"};
for (int i = 0; i < fruits.length; i++) {
System.out.printf("[%d]=%s%n", i, fruits[i]);
}
}
}
Javaユーティリティで初期値を一括設定
import java.util.Arrays;
public class UtilInit {
public static void main(String[] args) {
int[] arr = new int[5];
Arrays.fill(arr, -1); // 既定値で埋める
Arrays.setAll(arr, i -> i*i);// 添字から計算して埋める
System.out.println(Arrays.toString(arr)); // [0, 1, 4, 9, 16]
}
}
Java仕上げのアドバイス(重要部分のまとめ)
配列は「参照」を宣言してから、new またはリテラルで実体化します。デフォルト初期値(数値 0、boolean false、参照 null)を前提に、必要なら最初に安全な値で埋めます。リテラル初期化は最も読みやすく安全で、サイズ指定との併用は不可。固定長であることを忘れず、増やしたいときは Arrays.copyOf、頻繁な増減は ArrayList。null と空配列を使い分け、ユーティリティ(fill/setAll/copyOf)とループで「意図が見える初期化」を選ぶ——この基本を身につければ、配列初期化のつまずきはほぼ消えます。
