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

- システム
エンジニア - Javaの配列の要素を比較する方法が知りたいです。
- プロジェクト
マネージャー - 地道な方法やArrays.equalsを使った方法などを説明しますので、一緒に見ていきましょう。
Javaの配列の比較とは?
Javaで配列の中身が全て等しいかを比較するにはどうしたらよいのでしょうか。普通の変数であれば、==で比較できます。では配列も以下のように==で比較できるのでしょうか。
1
2
3
4
5
6
7
|
int [] ary_a = { 100, 110, 120 };
int [] ary_b = { 100, 110, 120 };
if (ary_a == ary_b) {
System.out.println("等しいです。");
}
|
配列を==で比較するとアドレスの比較になってしまう
上の結果は等しくなりません。それはary_aとary_bの比較は、それぞれの配列の参照アドレスの比較になるだけで、中身の比較にはならないからです。
アドレスというのは特定のデータのメモリ上の場所です。上のJavaサンプルではメモリの場所が同じかどうかを比較することになってしまいます。
ただし環境によっては、上のサンプルで等しいという結果になるかもしれません。JavaVMは同じ内容の変数はメモリ上で1つにまとめることがあるので、その場合は等しくなります。とはいえ配列の中身の値を比較しているわけではないので、上のように比較してはいけません。
地道な方法で比較する
ではどのようにして配列を比較したらよいのでしょうか。まず思いつくのは以下のJavaサンプルのような地道な方法でしょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int [] ary_a = { 100, 110, 120 };
int [] ary_b = { 100, 110, 120 };
if (ary_a.length != ary_b.length) {
System.out.println("サイズが違います。");
return;
}
for (int i = 0; i < ary_a.length; i++) {
if (ary_a[i]!=ary_b[i]) {
System.out.println("値が違います。");
return;
}
}
System.out.println("同じ内容です。");
|
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は同じ内容です。」だけが表示されます。内容だけでなく、サイズの違いもチェックできることがわかります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.util.*;
public class MainClass {
public static void main(String[] args) {
int [] ary_a = { 100, 110, 120 };
int [] ary_b = { 100, 110, 120 };
int [] ary_c = { 110, 110, 120 };
int [] ary_d = { 100, 110, 120, 130 };
if (Arrays.equals(ary_a, ary_b)) {
System.out.println("ary_aとary_bは同じ内容です。");
}
if (Arrays.equals(ary_a, ary_c)) {
System.out.println("ary_aとary_cは同じ内容です。");
}
if (Arrays.equals(ary_a, ary_d)) {
System.out.println("ary_aとary_dは同じ内容です。");
}
}
}
|
Arrays.equalsは様々な型に対応できる
Arrayクラスのequalsメソッドはint型以外の型にも対応できます。以下のJavaサンプルはfloat型とlong型の配列に利用しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.*;
public class MainClass {
public static void main(String[] args) {
float [] ary_a = { 100.0f, 110.0f, 120.0f };
float [] ary_b = { 100.0f, 110.0f, 120.0f };
if (Arrays.equals(ary_a, ary_b)) {
System.out.println("ary_aとary_bは同じ内容です。");
}
long [] ary_c = { 100, 200, 300 };
long [] ary_d = { 100, 200, 300 };
if (Arrays.equals(ary_c, ary_d)) {
System.out.println("ary_cとary_dは同じ内容です。");
}
}
}
|
実行結果は以下になります。
ary_aとary_bは同じ内容です。
ary_cとary_dは同じ内容です。
Arrays.equalsの落とし穴
Arrays.equalsはどんな配列の比較もできるわけではありません。以下のJavaサンプルはクラスの参照を持つ配列を比較しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import java.util.*;
class TestClass {
String str;
}
public class MainClass {
public static void main(String[] args) {
TestClass t1 = new TestClass();
TestClass t2 = new TestClass();
t1.str = "あいうえお";
t2.str = "あいうえお";
TestClass [] ary_a = { t1 };
TestClass [] ary_b = { t1 };
TestClass [] ary_c = { t2 };
if (Arrays.equals(ary_a, ary_b)) {
System.out.println("ary_aとary_bは同じ内容です。");
}
if (Arrays.equals(ary_a, ary_c)) {
System.out.println("ary_aとary_cは同じ内容です。");
}
}
}
|
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をオーバーライドしています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class TestClass {
String str;
public boolean equals(Object obj) {
if (obj instanceof TestClass) {
TestClass tc = (TestClass)obj;
if (str.equals(tc.str)) {
return true;
}
}
return false;
}
}
|
equalsメソッド内で比較処理をすれば参照型でも比較できる
上のTestClassのequalsメソッドでは、まず渡されたパラメータがTestClass型であることをinstanceofでチェックしてから、渡されたTestClassのメンバのフィールドのstrが、自分のクラスのstrと同じかどうかを比較します。そしてその結果をtrue/falseで返しています。
Arrays.equals内部では、Object.equalsを呼び出して比較しています。そのためこのようにequalsで比較処理をすれば意図通りに動作します。修正したJavaサンプルの結果は以下になります。
ary_aとary_bは同じ内容です。
ary_aとary_cは同じ内容です。
- システム
エンジニア - Javaの配列の要素を比較する方法がよく理解できました。
- プロジェクト
マネージャー - より理解を深めるために、さまざまな方法を試してみましょう。
Javaの配列の比較はArrays.equalsで!
Javaの配列の比較について解説しましたが、いかがだったでしょうか。Arrays.equalsを使えばスマートに出来ますが、参照型の場合は自前の比較処理が必要になります。そういったこともあるので、最初のforループを使う地道な方法で行うのもいいでしょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)