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

  1. FEnetJava
  2. Javaコラム
  3. Java入門
  4. Javaのequalsの使い方を解説します!|文字列はequalsで比較してみよう

Javaのequalsの使い方を解説します!|文字列はequalsで比較してみよう

  • Java入門
公開日時:
Javaのequalsの使い方を解説します!|文字列はequalsで比較してみよう
この記事でわかること

    システム
    エンジニア
    Javaでの文字列の比較構文にはどういったものがありますか?

    プロジェクト
    マネージャー
    では、代表的な構文から見ていきましょう。

    Javaのequalsとは?


    JavaのequalsとはObject型のequalsメソッドの事を指しますが、一般的にはそれをオーバーライドしたString型のequalsのことを言う場合がほとんどです。equalsメソッドの機能は2つのオブジェクトを比較して等しいかどうかを判別します。

    Javaで2つの比較と言えば最初に習うのは==です。==は数値の比較に使用しますが、文字列などのオブジェクトの比較には、==ではなくequalsを使用しなければなりません。

    文字列の比較にはequalsを使用する

    以下のJavaサンプルのように、文字列の比較は==ではなくequalsを使うのが正解です。

    String str1 = “”あいうえお””;
    String str2 = “”あいうえお””;

    //正解
    if (str1.equals(str2)) System.out.println(“”同じ内容です。””);
    //間違い
    if (str1==str2) System.out.println(“”同じ内容です。””);

    文字列は==ではなくequalsで比較する

    文字列の比較に==ではなくequalsを使用する理由は、equalsが文字列の内容の比較を行っているのに対し、==は参照のアドレスの比較を行っているからです。アドレスと言うと難しく感じると思いますが、アドレスとはコンピュータのメモリのデータの格納場所のことです。

    文字列の比較に==を使用すると、2つの文字列の内容が同じかどうかの比較ではなく、2つの文字列の格納場所が同じかどうかをチェックしてしまうのです。よって==では正しい比較ができないのです。

    ==でも正しく判定できる時がある?

    ところが、このJavaサンプルを実行すると==で判定している2つ目も「同じ内容です。」と表示されることがあります。なぜなのでしょうか。それはJavaの動作環境が、str1とstr2の文字列が同じ内容であるため、メモリ節約のために内部で1つにまとめてしまうからです。

    そのため==で判定しても参照が同じなので、等しい結果になる場合があります。しかしこれはあくまでたまたまそうなっているだけです。文字列の内容比較は必ずequalsで行いましょう。

    equalsIgnoreCaseは大文字小文字を無視して判定できる

    JavaのString型にはequals以外にequalsIgnoreCaseというメソッドもあります。これは大文字小文字を無視した比較ができます。以下のJavaサンプルをご覧ください。

    String str1 = “”abcdefg””;
    String str2 = “”aBcDeFg””;

    if (str1.equals(str2)) System.out.println(“”同じ内容です。””);
    if (str1.equalsIgnoreCase(str2)) System.out.println(“”同じ内容です(大文字小文字無視)。””);

    これを実行すると「同じ内容です(大文字小文字無視)。」とだけ表示されます。

    比較する文字列がnullだった場合

    比較する文字列がnullだった場合はどうなるのでしょうか?

    以下のJavaサンプルは空文字とnullを比較しています。

    String str1 = “”””;
    String str2 = null;

    if (!str1.equals(str2)) System.out.println(“”違う内容です。””);

    結果は「違う内容です。」と表示されます。if文の比較に!をつけていますが、これで判定が否(false)だった場合にtrueになります。

    なおstr1がnullだった場合はNullPointerExceptionが発生します。null参照のequalsメソッドにアクセスしてるからです。

    Objectsクラスのequalsメソッド

    Objectsというクラスにもequalsというメソッドがあります。これは2つのパラメータの内容比較を行うことが出来ます。なお以下のJavaサンプルを実行する場合はソースの先頭に「import java.util.*;」を記述してください。

    String str1 = “”あいうえお””;
    String str2 = “”あいうえお””;
    String str3 = null;
    String str4 = null;

    if (Objects.equals(str1, str2)) System.out.println(“”同じ内容です(1つ目)。””);
    if (Objects.equals(str3, str4)) System.out.println(“”同じ内容です(2つ目)。””);

    Objectsのequalsはnullにも対応できる

    上のJavaサンプルを実行すると、以下の結果になります。

    同じ内容です(1つ目)。
    同じ内容です(2つ目)。

    null同士を比較して結果がtrueになっています。このメソッドを使えばNullPointerExceptionの心配がありません。是非活用してください。

    次は文字列以外のequalsによる比較について見て行きましょう。

    Integer型などのequals

    String型以外のequalsメソッドの使い方を説明しましょう。

    以下のJavaサンプルをご覧ください。

    Integer i1 = Integer.valueOf(3);
    Integer i2 = Integer.valueOf(3);
    Short s1 = Short.valueOf((short)3);
    int int1 = 3;
    short short1 = 3;

    if (i1.equals(i2)) System.out.println(“”同じ内容です(1つ目)。””);
    if (i1.equals(s1)) System.out.println(“”同じ内容です(2つ目)。””);
    if (int1==short1) System.out.println(“”型は違っても同じです。””);

    Integer型などの仕様はしっかり押さえる

    上のJavaサンプルを実行すると、以下の結果になります。

    同じ内容です(1つ目)。
    型は違っても同じです。

    1つ目のif文はInteger型同士を比較して、別のオブジェクトですが中身が3なので同じと判定されています。2つ目は比較したInteger型とShort型は値は同じ3でも、型が違うので同じになりません。しかし、int型とshort型の変数の比較では、どちらも3のため同じになっています。

    2つ目と3つ目の結果が違うのは違和感があるかもしれませんが、これがJavaの仕様であると理解しましょう。

    Object型のequalsの動作

    全てのクラスのベースとなるObjectクラスのequalsはどのような効果があるのでしょうか。以下のJavaサンプルをご覧ください。

    Object o1 = new Object();
    Object o2 = o1;

    if (o1.equals(o2)) System.out.println(“”同じオブジェクトです。””);

    結果は「同じオブジェクトです。」と表示されます。Objectクラスのequalsは同じオブジェクトかどうかを判定できます。

    equalsを使う時は機能をしっかりチェックする

    ただし、ここまで見てきたようにObject型を継承するString型やInteger型などのequalsは、Object型のequalsをオーバーライドして、別のオブジェクトでも値が同じかどうかをチェックするメソッドになっています。Object型を継承したクラスでは、equalsの性質は違っているのです。

    よってequalsを使う時は、そのクラスでのequalsがどのような機能を持っているのかをしっかりチェックしてから使用しましょう。

    システム
    エンジニア
    equalsを利用することで文字列を比較できるようになるんですね。

    プロジェクト
    マネージャー
    はい。ただ、クラスごとに機能が違うのできちんとチェックしてくださいね。

    文字列を比較するときはequalsを使用しよう

    Javaのequalsについて解説してきましたが、ご理解頂けましたでしょうか。

    一番重要なことは、Javaの文字列の比較は==ではなくequalsを使用するということです。Java以外の言語では==で文字列を比較できる場合もあるので、混乱しないように注意しましょう。

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

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

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

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

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

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

    • 充実した研修制度

      充実した研修制度

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

    • 資格取得を応援

      資格取得を応援

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

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

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

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

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

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

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

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

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

    Java新着案件New Job