Java | 基礎文法:配列の初期化

Java Java
スポンサーリンク

配列初期化の全体像

配列の初期化は「配列オブジェクトを作る」と「要素に初期値を入れる」の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
Java

2次元は「配列の配列」なので、行ごとに長さの異なるジャグ配列も可能です。サイズ指定で作る場合は「外側→内側」の順に生成します。

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 の配列(存在している)」
Java

API 設計や条件分岐では「未初期化(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)とループで「意図が見える初期化」を選ぶ——この基本を身につければ、配列初期化のつまずきはほぼ消えます。

タイトルとURLをコピーしました