配列の比較の基本
配列の「中身が同じか」を調べたいときは、==ではなく 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(同じ箱を指しているから)
Java1次元配列は 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 - 参照比較は不要:
==は「同じ箱か」しか見ない
