Java | 配列比較メソッド

Java Java
スポンサーリンク

配列の比較の基本

配列の「中身が同じか」を調べたいときは、==ではなく Arrays.equals(1次元)か Arrays.deepEquals(多次元)を使います。==は「同じ箱そのものか」を見るだけで、中身は見ません。


なぜ == ではダメなのか

  • 意味: 参照(メモリ上の場所)が同じかどうかを比較します。
  • 結果: 中身が同じでも、別々に作った配列なら false になります。
int[] a = {85, 78, 92};
int[] b = {85, 78, 92};

System.out.println(a == b);        // false(箱が別物だから)
int[] c = a;
System.out.println(a == c);        // true(同じ箱を指しているから)
Java

1次元配列は Arrays.equals

  • 意味: 配列の要素数、順番、値がすべて一致しているかを比較します。
  • ポイント: 並び順も比較されるので、順番が違うと false
import java.util.Arrays;

int[] a = {85, 78, 92};
int[] b = {85, 78, 92};
int[] c = {85, 92, 78};

System.out.println(Arrays.equals(a, b));  // true(完全一致)
System.out.println(Arrays.equals(a, c));  // false(順番が違う)
Java
  • 注意: equals は「同じ値が入っているか」を見る。ソートしてから比較すれば「順番を無視した比較」もできる。
int[] x = {3, 1, 2};
int[] y = {2, 3, 1};

Arrays.sort(x);
Arrays.sort(y);
System.out.println(Arrays.equals(x, y));  // true(ソートして同じ並びになった)
Java

多次元配列は Arrays.deepEquals

  • 意味: 配列の中に配列が入っていても、奥まで中身を比較してくれます。
  • 理由: Arrays.equals だと内側の配列は「参照」だけを比較してしまうため不十分。
import java.util.Arrays;

int[][] a = {{10, 8}, {9, 14}};
int[][] b = {{10, 8}, {9, 14}};
int[][] c = {{10, 8}, {9, 15}};

System.out.println(Arrays.equals(a, b));      // false(内側配列の参照比較になる)
System.out.println(Arrays.deepEquals(a, b));  // true(中身まで比較)
System.out.println(Arrays.deepEquals(a, c));  // false(最後の値が違う)
Java

よくあるつまずきポイント

  • ==は参照比較: 「中身が同じか」ではなく「同じ箱か」を見る。
  • 順序も比較対象: Arrays.equals は順番が違うと false
  • 多次元は深さに注意: 2次元以上は deepEquals を使う。
  • nullに注意: どちらかが null のとき、Arrays.equals(null, arr) は安全に false を返す。arr.equals(...) だと NullPointerException の危険。

例題で理解を固める

例題1: テストの点数が同じか判定(1次元配列)

  • 目的: 同じ並びの点数なら「同じ」と判定する。
import java.util.Arrays;

public class Example1 {
    public static void main(String[] args) {
        int[] a = {70, 80, 90};
        int[] b = {70, 80, 90};
        int[] c = {90, 80, 70};

        System.out.println(Arrays.equals(a, b)); // true
        System.out.println(Arrays.equals(a, c)); // false(順番が違う)
    }
}
Java

例題2: 出席番号の並びを無視して同じメンバーか判定

  • 目的: メンバーの番号が同じなら順序に関係なく「同じ」と判定。
import java.util.Arrays;

public class Example2 {
    public static void main(String[] args) {
        int[] team1 = {3, 1, 5, 2};
        int[] team2 = {2, 5, 3, 1};

        int[] copy1 = Arrays.copyOf(team1, team1.length);
        int[] copy2 = Arrays.copyOf(team2, team2.length);
        Arrays.sort(copy1);
        Arrays.sort(copy2);

        System.out.println(Arrays.equals(copy1, copy2)); // true
    }
}
Java
  • ポイント: 元の配列を壊したくないときは、コピーしてからソート。

例題3: 座席表(2次元配列)が同じか判定

  • 目的: 2次元配列の中身まで同じかチェック。
import java.util.Arrays;

public class Example3 {
    public static void main(String[] args) {
        int[][] seatsA = {
            {1, 2, 3},
            {4, 5, 6}
        };
        int[][] seatsB = {
            {1, 2, 3},
            {4, 5, 6}
        };
        int[][] seatsC = {
            {1, 2, 3},
            {4, 6, 5}
        };

        System.out.println(Arrays.deepEquals(seatsA, seatsB)); // true
        System.out.println(Arrays.deepEquals(seatsA, seatsC)); // false
    }
}
Java

ミニクイズ

  • Q1: 下の出力はどうなる?
int[] a = {1, 2};
int[] b = {1, 2};
System.out.println(a == b);
System.out.println(Arrays.equals(a, b));
Java
  • Q2: 次の2次元配列は同じと判定される?
int[][] x = {{1, 2}, {3, 4}};
int[][] y = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(x, y));
System.out.println(Arrays.deepEquals(x, y));
Java
  • Q3: 順序を無視して比較したいとき、何をすればいい?

まとめ

  • 1次元配列の中身比較: Arrays.equals
  • 多次元配列の中身比較: Arrays.deepEquals
  • 参照比較は不要: == は「同じ箱か」しか見ない
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました