Javaエンジニア・プログラマ向けの技術情報・業界ニュースをお届けします。

  1. FEnetJava
  2. Javaコラム
  3. Java TIPS
  4. Javaの配列の要素を比較する方法!Arrays.equalsを使ったサンプル

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

  • Java TIPS
公開日時:   更新日時:
Javaの配列の要素を比較する方法!Arrays.equalsを使ったサンプル
この記事でわかること
    システム
    エンジニア
    Javaの配列の要素を比較する方法が知りたいです。
    プロジェクト
    マネージャー
    地道な方法や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は同じ内容です。

    システム
    エンジニア
    Javaの配列の要素を比較する方法がよく理解できました。
    プロジェクト
    マネージャー
    より理解を深めるために、さまざまな方法を試してみましょう。

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

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

    FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
    株式会社オープンアップシステムロゴ

    株式会社オープンアップシステムはこんな会社です

    秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
    数多くのエンジニアが集まります。

    秋葉原オフィスイメージ
    • スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。

    • 充実した研修制度

      充実した研修制度

      毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。

    • 資格取得を応援

      資格取得を応援

      スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。

    • 東証プライム上場企業グループ

      東証プライム上場企業グループ

      オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。

      安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。

    株式会社オープンアップシステムに興味を持った方へ

    株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。

    年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
    まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。

    株式会社オープンアップシステムへのご応募はこちら↓
    株式会社オープンアップシステムへのご応募はこちら↓

    Java新着案件New Job