Java 入門

Java 配列の基礎

配列(Arrays)は、同じデータ型の要素を一つの集合として格納するために使用されます。配列をどのように宣言し、初期化するかを理解することは、データを効率的に管理・操作するための鍵となります。配列はデータを構造化して整理する手段を提供し、一つの変数名だけで複数の値に対してバッチ処理を行うことを可能にします。

本章では、配列宣言の構文、さまざまな初期化メソッド、および配列要素の基本的な操作について包括的にカバーします。

1. 配列の宣言

Javaにおいて配列を宣言するには、配列に格納する要素の型と配列変数の名前を指定する必要があります。

注意点: 配列を宣言するアクション自体は、メモリ上に実際の配列を作成するわけではありません。それは単にコンパイラに対して「この変数は将来、特定の型の配列を保持するために使用される」と伝えているに過ぎません。

1.1 配列宣言の構文

Javaで配列を宣言する一般的な構文は以下の通りです。

データ型[] 配列名; // 推奨される書き方
// または
データ型 配列名[]; // これも有効ですが、あまり一般的ではありません
  • データ型 (dataType): 配列が格納する要素の型を指定します(例:intStringdouble、またはその他の有効な Java 型)。
  • []: 角括弧は、この変数が配列であることを表します。
  • 配列名 (arrayName): この配列変数に付ける名前です。

コード例:

int[] numbers;         // 整数型の配列を宣言
String[] names;       // 文字列型の配列を宣言
double[] prices;       // 倍精度浮点数型の配列を宣言
boolean[] flags;       // ブーリアン型の配列を宣言

これらの例において、numbersnamesprices、および flags はすべて配列変数です。この段階では、システムは要素を格納するためのメモリ領域をまだ割り当てていません。これらの宣言は、各変数が将来参照する配列の型を定義しているだけです。

2. 配列の初期化

配列を宣言した後、メモリ領域を割り当て、その要素に初期値を付与するために「初期化」を行う必要があります。Java には配列を初期化する方法がいくつかあります。

2.1 new キーワードによる初期化

これは最も一般的な初期化方法です。new キーワードは、メモリ上に配列のためのスペースを確保します。

構文:

配列名 = new データ型[配列の長さ];
  • 配列名 (arrayName): 配列変数の名前。
  • new: メモリを割り当てるためのキーワード。
  • データ型 (dataType): 配列が格納する要素の型。
  • 配列の長さ (arraySize): 配列が収容できる要素の数。これは非負の整数である必要があります。

コード例:

int[] numbers = new int[5]; // 5つの整数を収容できる配列を作成

この例では、numbers という名前の配列が作成され、容量は 5 です。デフォルトでは、配列の各要素はそのデータ型のデフォルト値で初期化されます。int 型の場合、デフォルト値は 0 です。

詳細解説:

  • int[] numbers: numbers という名前の整数配列変数を宣言します。
  • new int[5]: メモリ内に 5 つの整数分のスペースを割り当てます。各要素は 0 に初期化されます。
  • =: 新しく作成された配列のメモリ番地(参照)を numbers 変数に代入します。

3. 配列のデフォルト値

new キーワードを使用して配列を初期化した際、Java は要素のデータ型に応じて自動的にデフォルト値を割り当てます。

  • int, short, byte, long: 0
  • float: 0.0f
  • double: 0.0d
  • boolean: false
  • char: \u0000 (空文字)
  • オブジェクト参照 (例: String): null

デフォルト値を確認するデモコード:

public class DefaultValues {
    public static void main(String[] args) {
        int[] intArray = new int[3];
        double[] doubleArray = new double[3];
        boolean[] booleanArray = new boolean[3];
        String[] stringArray = new String[3];

        System.out.println("整数配列のデフォルト値:");
        for (int i = 0; i < intArray.length; i++) {
            System.out.println("intArray[" + i + "] = " + intArray[i]);
        }

        System.out.println("\n倍精度浮点数配列のデフォルト値:");
        for (int i = 0; i < doubleArray.length; i++) {
            System.out.println("doubleArray[" + i + "] = " + doubleArray[i]);
        }

        System.out.println("\nブーリアン配列のデフォルト値:");
        for (int i = 0; i < booleanArray.length; i++) {
            System.out.println("booleanArray[" + i + "] = " + booleanArray[i]);
        }

        System.out.println("\n文字列配列のデフォルト値:");
        for (int i = 0; i < stringArray.length; i++) {
            System.out.println("stringArray[" + i + "] = " + stringArray[i]);
        }
    }
}

出力結果:

整数配列のデフォルト値:
intArray[0] = 0
intArray[1] = 0
intArray[2] = 0

倍精度浮点数配列のデフォルト値:
doubleArray[0] = 0.0
doubleArray[1] = 0.0
doubleArray[2] = 0.0

ブーリアン配列のデフォルト値:
booleanArray[0] = false
booleanArray[1] = false
booleanArray[2] = false

文字列配列のデフォルト値:
stringArray[0] = null
stringArray[1] = null
stringArray[2] = null

4. 配列リテラルによる初期化

配列リテラル(Array Literals)は、一つのステートメント内で配列の宣言、初期化、および値の代入を完結させる非常に簡潔な方法を提供します。宣言時に格納すべき具体的な値が既に決まっている場合に、この方法は特に有効です。

4.1 配列リテラルの構文

データ型[] 配列名 = {値1, 値2, 値3, ...};
  • {値1, 値2, ...}: 一連の値をカンマで区切り、中括弧 {} で囲みます。配列の長さは、提供された値の数によって自動的に決定されます。

コード例:

int[] numbers = {1, 2, 3, 4, 5}; // 指定された5つの整数を含む配列を作成
String[] names = {"Alice", "Bob", "Charlie"}; // 3つの文字列を含む配列を作成

4.2 宣言と初期化の組み合わせ

配列リテラルを使用すると、宣言と初期化を同一行にシームレスに結合できます。

int[] numbers = {1, 2, 3, 4, 5};

これは内部的には以下のコードと等価です。

int[] numbers;
numbers = new int[]{1, 2, 3, 4, 5};

よくある間違いの注意: 簡略化されたリテラル代入を、宣言の後に切り離して行うことはできません。以下の書き方はコンパイルエラーになります。

int[] numbers;
numbers = {1, 2, 3, 4, 5}; // コンパイルエラー!

もし宣言と代入を分けて書く場合は、Java の仕様により、代入時に new キーワードを使用することが強制されます(前述の new int[]{...} の形式)。

5. 配列要素の個別初期化

配列のインデックス(Index)を使用して、各要素に個別にアクセスし、初期化することも可能です。

重要: 配列のインデックスは 0 から始まり、配列の長さ - 1 で終わります。

5.1 単一要素の初期化構文

配列名[インデックス] = 値;

コード例:

int[] numbers = new int[5]; // 長さ5の配列を作成、デフォルトはすべて0

numbers[0] = 10; // 最初の要素(インデックス0)に10を代入
numbers[1] = 20; // 2番目の要素(インデックス1)に20を代入
numbers[2] = 30; // 3番目の要素(インデックス2)に30を代入
numbers[3] = 40; // 4番目の要素(インデックス3)に40を代入
numbers[4] = 50; // 5番目の要素(インデックス4)に50を代入

5.2 厳重警告:配列の境界外例外

存在しないインデックス(インデックスが 0 未満、または配列の長さ以上)にアクセスしようとすると、プログラムは実行時に ArrayIndexOutOfBoundsException(配列インデックス境界外例外)をスローし、クラッシュします。

誤った例:

int[] numbers = new int[5]; // 有効なインデックスは 0, 1, 2, 3, 4
numbers[5] = 60; // クラッシュ! ArrayIndexOutOfBoundsException が発生

6. 実践演習:配列の活用

配列の宣言と初期化に関する知識を定着させるために、いくつか実用的なコード例を見てみましょう。

6.1 例 1:学生の成績を保存する

5 人の学生の成績を配列に保存すると仮定します。整数配列を宣言して初期化します。

public class StudentGrades {
    public static void main(String[] args) {
        // 学生の成績を保存するための配列を宣言・初期化
        int[] grades = new int[5];
        
        // 各学生に成績を割り当て
        grades[0] = 85;
        grades[1] = 90;
        grades[2] = 78;
        grades[3] = 92;
        grades[4] = 88;
        
        // 各学生の成績を出力
        System.out.println("学生の成績リスト:");
        for (int i = 0; i < grades.length; i++) {
            System.out.println("学生 " + (i + 1) + ": " + grades[i]);
        }
    }
}

6.2 例 2:曜日を保存する

文字列配列と配列リテラルを組み合わせて、曜日の名前を保存します。

public class Weekdays {
    public static void main(String[] args) {
        // 配列リテラルを使用して文字列配列を宣言・初期化
        String[] weekdays = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        
        // 曜日の名前を出力
        System.out.println("一週間の曜日:");
        for (int i = 0; i < weekdays.length; i++) {
            System.out.println(weekdays[i]);
        }
    }
}

6.3 例 3:配列要素の合計を計算する

配列内の整数をすべて加算するデモです。

public class ArraySum {
    public static void main(String[] args) {
        // 整数型の配列を宣言・初期化
        int[] numbers = {1, 2, 3, 4, 5};
        
        // 配列要素の合計を計算
        int sum = 0;
        for (int i = 0; i < numbers.length; i++) {
            sum += numbers[i];
        }
        
        // 合計を出力
        System.out.println("配列要素の合計: " + sum);
    }
}