Java で配列の内容を比較する際、equals() や Arrays.equals() では「中身まで比較できない」ケースがあります。
特に 多次元配列やネストした配列を扱う場合、Arrays.deepEquals() を使うことで「要素の奥深くまで」正しく比較できます。
この記事では、deepEquals() の仕組み・注意点・実際の活用例をわかりやすく整理します。
■ なぜ Arrays.deepEquals() が必要なのか?
Java の配列はオブジェクトのため、== や equals() では「参照比較」しか行いません。
Arrays.equals() を使うと 1 次元配列は比較できますが、多次元配列では内部の配列を参照として比較してしまいます。
ここで役立つのが Arrays.deepEquals() です。
■ Arrays.deepEquals() の基本動作
deepEquals() は以下のように動作します:
-
配列の中身を 再帰的に 辿って比較する
-
多次元配列・ネストした配列を正しく比較できる
-
オブジェクト配列についても、それぞれの
equals()を呼び出す
つまり、Java の配列比較で最も厳密な評価ができます。
■ サンプル:多次元配列で true になる比較
内部配列まで順に比較されるため、期待通り true となります。
■ Arrays.equals() との違いをまとめる
| 比較方法 | 比較内容 | 多次元配列 |
|---|---|---|
| == | 参照比較 | 比較不可 |
| equals() | 参照比較 | 比較不可 |
| Arrays.equals() | 1階層のみの要素比較 | NG |
| Arrays.deepEquals() | 再帰的に中身を比較 | OK |
多次元配列なら基本的に deepEquals 一択 です。
■ オブジェクト配列を比較したい場合
deepEquals() はオブジェクト型にも利用できます。
ネストされたオブジェクトも、equals() が正しく実装されていれば比較できます。
■ 注意点:プリミティブ配列とオブジェクト配列の扱い
deepEquals() は プリミティブ配列にも対応しています。
ただし、int[] はプリミティブなので equals() は使えず、deepEquals 内で適切に比較されます。
■ 注意点:循環参照は比較不可
以下のような「自分自身を指す配列」には対応できません。
通常の利用ではまず問題になりませんが、循環構造を扱うデータでは注意しましょう。
■ 実務でのおすすめの使い分け
1. 多次元配列 → deepEquals
ログ比較・テストコードで特に便利。
2. 1次元配列(プリミティブ) → Arrays.equals
こちらのほうが軽量で高速。
3. ネストしたオブジェクト比較 → deepEquals
配列階層が深い場合は必須。
■ JUnit との組み合わせ例(おすすめ)
テストでよく使うパターンです。
多次元配列の検証に最適です。
■ まとめ:配列比較で迷ったら deepEquals() を使う
-
多次元配列 / ネスト配列 →
deepEquals() -
1次元配列だけなら
Arrays.equals() -
==とequals()は参照比較
配列の内容を厳密に比較するなら deepEquals が最も安全な方法 です。
