「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

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 が最も安全な方法 です。

Ads by Google

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
0
あなたの考えが大好きです、コメントしてください。x