9.

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 list1 = Arrays.asList(arr);           // 固定長 List
List list2 = new ArrayList<>(Arrays.asList(arr)); // 可変長
List list3 = List.of(arr);                 // Java 9+ 不変

// List → 配列
List 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 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)

編集
Post Share
子ページ
  1. オブジェクトを配列に変換する方法
同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法