Javaコラム Javaエンジニアのためのお役立ちコラム

Java

Javaの配列の要素を比較する方法!Arrays.equalsを使ったサンプル

2021年07月19日
SE
Javaの配列の要素を比較する方法が知りたいです。
PM
地道な方法やArrays.equalsを使った方法などを説明しますので、一緒に見ていきましょう。

Javaの配列の比較とは?


Javaで配列の中身が全て等しいかを比較するにはどうしたらよいのでしょうか。普通の変数であれば、==で比較できます。では配列も以下のように==で比較できるのでしょうか。

配列を==で比較するとアドレスの比較になってしまう

上の結果は等しくなりません。それはary_aとary_bの比較は、それぞれの配列の参照アドレスの比較になるだけで、中身の比較にはならないからです。

アドレスというのは特定のデータのメモリ上の場所です。上のJavaサンプルではメモリの場所が同じかどうかを比較することになってしまいます。

ただし環境によっては、上のサンプルで等しいという結果になるかもしれません。JavaVMは同じ内容の変数はメモリ上で1つにまとめることがあるので、その場合は等しくなります。とはいえ配列の中身の値を比較しているわけではないので、上のように比較してはいけません。

地道な方法で比較する

ではどのようにして配列を比較したらよいのでしょうか。まず思いつくのは以下のJavaサンプルのような地道な方法でしょう。

Arrays.equalsを使う方法

上のJavaサンプルではまず配列のサイズを比較し、同じであればforループで1つずつ比較しています。結果は「同じ内容です。」になります。この方法で問題ありませんが、地道な方法に感じます。

もっと簡単でスマートな方法はないのでしょうか。そういう時はjava.util.Arraysクラスのequalsメソッドを利用します。以下のような仕様になっています。

static boolean equals(int[] a, int[] a2)

指定された2つのint値の配列が互いに同等である場合にtrueを返します。

Arrays.equalsを使ったサンプル

以下がArrays.equalsを使ったJavaサンプルです。結果は「ary_aとary_bは同じ内容です。」だけが表示されます。内容だけでなく、サイズの違いもチェックできることがわかります。

Arrays.equalsは様々な型に対応できる

Arrayクラスのequalsメソッドはint型以外の型にも対応できます。以下のJavaサンプルはfloat型とlong型の配列に利用しています。

実行結果は以下になります。

ary_aとary_bは同じ内容です。
ary_cとary_dは同じ内容です。

Arrays.equalsの落とし穴

Arrays.equalsはどんな配列の比較もできるわけではありません。以下のJavaサンプルはクラスの参照を持つ配列を比較しています。

Arrays.equalsは参照したクラスの中身までは比較してくれない

上のJavaサンプルの実行結果は、「ary_aとary_bは同じ内容です。」だけが表示されます。ary_aとary_cは同じと判断されません。しかしary_cの中身のt2は、t1と同じ内容です。Arrays.equalsはメンバフィールドの中身の比較まではできないということです。

ではary_cもary_aと同じと判断させるにはどうしたらよいのでしょうか。その場合は、Object.equalsをオーバーライドして、その中で比較処理を記述すれば可能です。

配列の参照型の中身の比較をするサンプル

上のJavaサンプルのTestClassを以下のように修正しましょう。Object.equalsをオーバーライドしています。

equalsメソッド内で比較処理をすれば参照型でも比較できる

上のTestClassのequalsメソッドでは、まず渡されたパラメータがTestClass型であることをinstanceofでチェックしてから、渡されたTestClassのメンバのフィールドのstrが、自分のクラスのstrと同じかどうかを比較します。そしてその結果をtrue/falseで返しています。

Arrays.equals内部では、Object.equalsを呼び出して比較しています。そのためこのようにequalsで比較処理をすれば意図通りに動作します。修正したJavaサンプルの結果は以下になります。

ary_aとary_bは同じ内容です。
ary_aとary_cは同じ内容です。

SE
Javaの配列の要素を比較する方法がよく理解できました。
PM
より理解を深めるために、さまざまな方法を試してみましょう。

Javaの配列の比較はArrays.equalsで!

Javaの配列の比較について解説しましたが、いかがだったでしょうか。Arrays.equalsを使えばスマートに出来ますが、参照型の場合は自前の比較処理が必要になります。そういったこともあるので、最初のforループを使う地道な方法で行うのもいいでしょう。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags