配列

配列は同じ型のデータを格納するコンテナです。このレッスンでは、Javaでの配列の使用方法を学びます。

配列とは

配列は同じ型の要素の固定サイズのコレクションです。

配列の特徴

特徴 説明
固定サイズ 作成後にサイズを変更できない
同じ型 すべての要素が同じ型でなければならない
連続ストレージ 要素はメモリ内に連続して格納
インデックスアクセス インデックスで要素にアクセス(0から開始)

宣言と初期化

方法1:先に宣言してから初期化

JAVA
// 配列を宣言
int[] arr;

// 初期化(スペースを割り当て)
arr = new int[5];  // 5つの要素、デフォルト値は0

方法2:宣言と初期化を同時に行う

JAVA
// サイズを指定
int[] arr = new int[5];

// 直接代入
int[] arr = {1, 2, 3, 4, 5};

例:配列の初期化

JAVA
public class ArrayInit {
    public static void main(String[] args) {
        // 方法1:サイズを指定
        int[] arr1 = new int[3];
        arr1[0] = 10;
        arr1[1] = 20;
        arr1[2] = 30;
        
        // 方法2:直接代入
        int[] arr2 = {10, 20, 30};
        
        // 方法3:new + 代入
        int[] arr3 = new int[]{10, 20, 30};
        
        System.out.println(arr2[0]);  // 10
        System.out.println(arr2[1]);  // 20
        System.out.println(arr2[2]);  // 30
    }
}
▶ 試してみよう
⚠️ 注意: 配列のインデックスは0から始まります。最大インデックスは長さ-1です。範囲外へのアクセスはArrayIndexOutOfBoundsExceptionをスローします。

アクセスと変更

JAVA
int[] arr = {10, 20, 30, 40, 50};

// 要素にアクセス
int first = arr[0];   // 10
int third = arr[2];   // 30

// 要素を変更
arr[1] = 200;         // 20を200に変更

// 配列の長さを取得
int len = arr.length; // 5

配列の走査

方法1:通常のforループ

JAVA
int[] arr = {10, 20, 30, 40, 50};

for (int i = 0; i < arr.length; i++) {
    System.out.println("arr[" + i + "] = " + arr[i]);
}

方法2:for-eachループ

JAVA
int[] arr = {10, 20, 30, 40, 50};

for (int num : arr) {
    System.out.println(num);
}

例:平均値の計算

JAVA
public class ArrayAverage {
    public static void main(String[] args) {
        int[] scores = {85, 92, 78, 96, 88};
        int sum = 0;
        
        for (int score : scores) {
            sum += score;
        }
        
        double avg = (double) sum / scores.length;
        System.out.println("平均値: " + avg);  // 87.8
    }
}
▶ 試してみよう

Arraysユーティリティクラス

java.util.Arraysは配列操作のためのユーティリティメソッドを提供します。

一般的なメソッド

メソッド 説明
sort() ソート Arrays.sort(arr)
copyOf() コピー Arrays.copyOf(arr, newLen)
fill() 埋める Arrays.fill(arr, value)
equals() 比較 Arrays.equals(arr1, arr2)
toString() 文字列に変換 Arrays.toString(arr)
binarySearch() 二分探索 Arrays.binarySearch(arr, key)

例:Arraysの使用

JAVA
import java.util.Arrays;

public class ArraysDemo {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 1, 9, 3};
        
        // ソート
        Arrays.sort(arr);
        System.out.println("ソート後: " + Arrays.toString(arr));
        // [1, 2, 3, 5, 8, 9]
        
        // コピー
        int[] arr2 = Arrays.copyOf(arr, 3);
        System.out.println("最初の3つ: " + Arrays.toString(arr2));
        // [1, 2, 3]
        
        // 埋める
        int[] arr3 = new int[5];
        Arrays.fill(arr3, 100);
        System.out.println("埋めた後: " + Arrays.toString(arr3));
        // [100, 100, 100, 100, 100]
        
        // 検索(最初にソートが必要)
        int index = Arrays.binarySearch(arr, 5);
        System.out.println("5のインデックス: " + index);  // 3
    }
}
▶ 試してみよう

二次元配列

二次元配列は「配列の配列」と考えることができます。

宣言と初期化

JAVA
// 方法1:サイズを指定
int[][] matrix = new int[3][4];  // 3行4列

// 方法2:直接代入
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

例:二次元配列の走査

JAVA
public class TwoDArrayDemo {
    public static void main(String[] args) {
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        
        // 走査
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
        // 出力:
        // 1 2 3
        // 4 5 6
        // 7 8 9
    }
}
▶ 試してみよう

例:行列の転置

JAVA
public class MatrixTranspose {
    public static void main(String[] args) {
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6}
        };
        
        // 転置: 2行3列 → 3行2列
        int[][] transposed = new int[3][2];
        
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                transposed[j][i] = matrix[i][j];
            }
        }
        
        // 転置された行列を表示
        for (int[] row : transposed) {
            System.out.println(java.util.Arrays.toString(row));
        }
        // [1, 4]
        // [2, 5]
        // [3, 6]
    }
}
▶ 試してみよう

Varargs(可変長引数)

Varargsにより、メソッドが可変数の引数を受け取ることができます。

構文

JAVA
public static int sum(int... numbers) {
    int total = 0;
    for (int num : numbers) {
        total += num;
    }
    return total;
}

例:Varargs

JAVA
public class VarargsDemo {
    public static void main(String[] args) {
        System.out.println(sum(1, 2));           // 3
        System.out.println(sum(1, 2, 3));        // 6
        System.out.println(sum(1, 2, 3, 4, 5));  // 15
    }
    
    public static int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }
}
▶ 試してみよう
⚠️ 注意: Varargsはメソッドの最後のパラメータでなければならず、メソッドには1つのvarargsパラメータしか持つことができません。

一般的な配列アルゴリズム

例:バブルソート

JAVA
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 1, 9, 3};
        
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        
        System.out.println(java.util.Arrays.toString(arr));
        // [1, 2, 3, 5, 8, 9]
    }
}
▶ 試してみよう

例:最大値を見つける

JAVA
public class FindMax {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 1, 9, 3};
        int max = arr[0];
        
        for (int num : arr) {
            if (num > max) {
                max = num;
            }
        }
        
        System.out.println("最大値: " + max);  // 9
    }
}
▶ 試してみよう

❓ よくある質問

Q 配列のサイズは変更できますか?
A いいえ。配列のサイズは固定です。動的なサイズが必要な場合は、ArrayListを使用してください。
Q 配列にはデフォルト値がありますか?
A はい。intは0、doubleは0.0、booleanはfalse、参照型はnullです。
Q Arrays.sort()はどのソートアルゴリズムを使用していますか?
A プリミティブ型にはデュアルピボットクイックソート、オブジェクトにはTimSort(マージソートの変種)を使用しています。

📖 まとめ

📝 演習

  1. 配列操作: 10個の要素を持つ配列を作成し、1-10の値を割り当て、逆順で表示
  2. 最大値/最小値: 配列の最大値と最小値を見つける
  3. バブルソート: バブルソートアルゴリズムを実装し、配列を昇順にソート

次のレッスン

次のレッスンでは、実践:基礎を学びます — 最初の7レッスンの知識を適用します。

100%