この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:9
ページ更新者:爽健
更新日時:2026-06-11 07:10:02

タイトル: 配列
SEOタイトル: Java 配列完全ガイド — 宣言・操作・Arrays クラス

この記事の要点
  • 配列宣言: int[] arr = new int[10]; または int[] arr = {1, 2, 3};
  • 長さは arr.length (メソッドではなくフィールド)。生成後に変更不可
  • 多次元配列は配列の配列: int[][] grid = new int[3][4]; ジャグ配列も可
  • java.util.Arrays クラスに sort / copyOf / asList / stream / toString など便利メソッド
  • 可変長が必要なら ArrayList を使う。範囲外アクセスは ArrayIndexOutOfBoundsException

配列の宣言と初期化

// 1. サイズ指定で生成(全要素デフォルト値)
int[] a = new int[5];           // {0, 0, 0, 0, 0}
String[] s = new String[3];     // {null, null, null}
boolean[] b = new boolean[3];   // {false, false, false}

// 2. リテラル初期化
int[] nums = {1, 2, 3, 4, 5};
String[] names = {"Taro", "Hanako", "Jiro"};

// 3. new + 初期化子
int[] m = new int[]{10, 20, 30};

// 4. 宣言と代入を分ける場合は new 必須
int[] x;
x = new int[]{1, 2, 3};      // OK
// x = {1, 2, 3};            // ❌ コンパイルエラー

// 宣言の書き方バリエーション
int[] aa;        // 推奨
int aa[];        // 旧 C 風(非推奨)

要素アクセスと長さ

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

arr[0];                 // 10
arr[arr.length - 1];    // 50
arr.length;             // 5 ← フィールド(() 不要)

arr[2] = 99;            // 代入
System.out.println(arr[2]); // 99

// 範囲外アクセス
arr[10];                // ArrayIndexOutOfBoundsException
arr[-1];                // 同上

ループによる走査

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

// 1. インデックス for
for (int i = 0; i < nums.length; i++) {
    System.out.println(i + ": " + nums[i]);
}

// 2. 拡張 for(インデックス不要なら推奨)
for (int n : nums) {
    System.out.println(n);
}

// 3. Stream (Java 8+)
java.util.Arrays.stream(nums).forEach(System.out::println);

// 4. 合計
int sum = 0;
for (int n : nums) sum += n;
// または
int sum2 = java.util.Arrays.stream(nums).sum();

多次元配列

// 2 次元配列(矩形)
int[][] grid = new int[3][4];   // 3 行 4 列、全 0
grid[0][0] = 1;
grid[2][3] = 99;
grid.length;                    // 3(行数)
grid[0].length;                 // 4(列数)

// リテラル
int[][] m = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// ジャグ配列(行ごとに列数が違う)
int[][] jag = new int[3][];
jag[0] = new int[]{1};
jag[1] = new int[]{1, 2};
jag[2] = new int[]{1, 2, 3};

// 走査
for (int[] row : m) {
    for (int v : row) System.out.print(v + " ");
    System.out.println();
}

java.util.Arrays クラスの主要メソッド

メソッド動作
Arrays.sort(arr)昇順ソート(破壊的)
Arrays.sort(arr, comparator)カスタム比較器でソート
Arrays.copyOf(arr, newLen)長さを変えてコピー
Arrays.copyOfRange(arr, from, to)部分コピー
Arrays.fill(arr, value)全要素を value で埋める
Arrays.equals(a, b)要素ごとの等価比較
Arrays.toString(arr)文字列化(デバッグ用)
Arrays.asList(arr)固定長 List に変換
Arrays.stream(arr)Stream に変換
Arrays.binarySearch(arr, key)ソート済配列を二分探索
import java.util.Arrays;

int[] arr = {3, 1, 4, 1, 5, 9, 2, 6};

Arrays.sort(arr);                       // [1, 1, 2, 3, 4, 5, 6, 9]
System.out.println(Arrays.toString(arr));

int[] copy = Arrays.copyOf(arr, 10);    // 末尾に 0 を 2 個追加
int[] part = Arrays.copyOfRange(arr, 2, 5); // {2, 3, 4}

// Stream
int max = Arrays.stream(arr).max().getAsInt();
int sum = Arrays.stream(arr).sum();
double avg = Arrays.stream(arr).average().getAsDouble();

// 比較
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
a == b;                  // false(参照比較)
Arrays.equals(a, b);     // true

配列 ⇔ List 変換

import java.util.*;

// 配列 → List
String[] arr = {"a", "b", "c"};
List<String> list1 = Arrays.asList(arr);           // 固定長 List
List<String> list2 = new ArrayList<>(Arrays.asList(arr)); // 可変長
List<String> list3 = List.of(arr);                 // Java 9+ 不変

// List → 配列
List<String> src = List.of("x", "y", "z");
String[] out = src.toArray(new String[0]);
String[] out2 = src.toArray(String[]::new);        // Java 11+

// プリミティブ配列 ↔ Stream
int[] ints = {1, 2, 3};
List<Integer> boxed = Arrays.stream(ints).boxed().toList();
int[] back = boxed.stream().mapToInt(Integer::intValue).toArray();

配列と ArrayList の使い分け

項目配列ArrayList
長さ固定(変更不可)可変
要素アクセスarr[i]list.get(i)
サイズarr.lengthlist.size()
プリミティブOK (int[] 等)NG (Integer 等のラッパー必須)
性能速い(連続メモリ)autoboxing オーバーヘッド
用途サイズ既知・大量数値動的に追加削除する場合

よくある例外

int[] arr = new int[3];

// ArrayIndexOutOfBoundsException
arr[3] = 1;                    // インデックス 3 は範囲外 (0-2)
arr[-1] = 1;                   // 負も範囲外

// NullPointerException
int[] nullArr = null;
nullArr.length;                // NPE
nullArr[0] = 1;                // NPE

// ArrayStoreException(参照型配列のみ)
Object[] objs = new String[3]; // OK(共変)
objs[0] = 100;                 // 実体は String[] なので Integer 入れられない

FAQ

Q: 配列のサイズを途中で変更したい
A: 不可。Arrays.copyOf で新サイズの配列を作り直すか、最初から ArrayList を使う。

Q: 配列を初期化済みの List に渡すとどうなる?
A: Arrays.asList固定長 List(要素変更可だが add/remove 不可)。可変長が欲しいなら new ArrayList<>(Arrays.asList(arr))

Q: 配列を System.out.println しても住所しか出ない
A: Arrays.toString(arr) を使う。多次元なら Arrays.deepToString(grid)