【速習Java】”==”と”equals”の違い(否定の方法も解説)

こんにちは!フリーライターの中井です。

Javaには文字列の比較を行うStringクラスに属するequalsメソッドがあります。この記事では、equalsメソッドについて

  • 「==」と「equals」の違いについて
  • equalsメソッドで否定の判定をする方法
  • 複数の否定の判定をする方法
  • equalsメソッドの例外の注意点
  • equalsメソッドの例外に対処する2つの方法

などの使い方に関しても解説していきます。今回はそんなequalsメソッドについて、わかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

「==」と「equals」の違いについて

int型などのプリミティブ型で2つの値が等しいか比較する場合は”==”演算子で比較しますが、String型などの参照型の場合はequalsメソッドで比較する必要があります。

String型などの参照型の場合に”==”演算子で比較すると参照先が同じかどうかを比較することになります。参照先の値を比較する訳ではありません。

サンプルコードで確認していきましょう。

public class JavaEquals {

    public static void main(String[] args) {
        String hoge = "Hello";
        String fuga = "Hello";
        hoge += "!";
        fuga += "!";
        
        if(hoge == fuga) {
            System.out.println("hogeとfugaとは等しい");
        } else {
            System.out.println("hogeとfugaとは違う");
        }
        
        if(hoge.equals(fuga)) {
            System.out.println("hogeとfugaとは等しい");
        } else {
            System.out.println("hogeとfugaとは違う");
        }
    }
    
}

実行結果:

hogeとfugaとは違う
hogeとfugaとは等しい

このサンプルコードでは、String型変数のhogeとfugaを同じ文字列で初期化し、同じ文字列を追加しています。

しかし、実行結果をみると”==”で比較した場合は”false”を返し、equalsメソッドで比較した場合は”true”を返しています。String型は宣言、初期化時には擬似プリミティブ型として扱われますが、文字列を追加したときに参照型として扱われるようになります。

したがって、値が同じであっても参照先が違うので”==”で比較した場合は”false”を返します。equalsメソッドで比較した場合は値が同じですので、”true”を返しています。

String型の文字列をequalsメソッドで比較する方法についてはこちらで詳しく解説していますので、参考にしてください。

equalsメソッドで否定の判定をする方法

equalsメソッドは文字列を比較して等しい場合に“true”を返しますが、文字列が等しい場合に“false”を返す処理をしたいと思ったことはありませんか?

そんなときは、否定の論理演算子”!”を使うことで“true”と”false”の判定を逆にすることができます。否定の論理演算子”!”の使い方を次のプログラムで確認してみましょう。

public class JavaNotEqual {

    public static void main(String[] args) {
        String str1 = "HELLO";
        String str2 = "HELLO"; 
    
        if(!(str1.equals(str2))) {
            System.out.println(!(str1.equals(str2)));
            System.out.println(str1 + "と" + str2 + "は違います");
        } else {
            System.out.println(!(str1.equals(str2)));
            System.out.println(str1 + "と" + str2 + "は同じです"); 
       }
    }
    
}

実行結果:

false
HELLOとHELLOは同じです

このプログラムのポイントは次の2点です。

  • equealsメソッドを使ってstr1とstr2の文字列が違うのか調べる
  • 否定を判定するときには論理演算子”!”を使用

このプログラムは単純に文字列を調べ、違っていたらtrue、同じならfalseと出力しています。当然同じなので、falseと返しています。

複数の否定の判定をする方法

論理演算子である!マークは、他の条件とも組み合わせて使うことができます。次のプログラムでは名前とパスワードの両方が一致しているときに“false”を返す処理をするために、“&&”演算子と組み合わせて使っています。ソースコードで確認してみましょう。

public class JavaEquals {

    public static void main(String[] args) {

        String userId = "abcde";
        
        String name ="SAMURAI HANAKO";
        String newName ="OSAMURAI HANAKO";
        
        String password ="12345";
        String newPassword="12354";
       
         if (!(name.equals(newName)) && !(password.equals(newPassword))) {
            System.out.println("名前かパスワードが異なります。");      
        } else {
            System.out.println( "名前とパスワードが一致しました。");  
        }  
 
    }
    
}

実行結果:

名前かパスワードが異なります。

equalsメソッドの注意点

equalsメソッドの注意点は、主に3つあります。

equalsメソッドと例外発生(nullPointerException)

まず1つ目は、nullが入ったオブジェクトからメソッドを呼び出すとnullPointerExceptionの例外を投げます。文章では分かりづらいので、実際にソースを見ていきましょう。

public class JavaEquals {

    public static void main(String[] args) {
        String hoge = null;
        
        if (hoge.equals("Hello")) {
            System.out.println(hoge.equals("Hello"));
            System.out.println( "hogeには" + hoge + "が入っています");
        }
    }
    
}

実行結果:

Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:6)

このソースコードは、hogeとHelloが等しい文字列か調べていますが、よく見てください。肝心のhogeには、nullが入っています。このnullは値の参照先がない状態です。nullのオブジェクトからメソッドを呼び出そうとするとNullPointerExceptionの例外が発生します。

try-catch文などで例外処理をしていない場合には、一度例外が起きるとそれ以降のプログラムは実行されないようになります。ですので、そうならないようにプログラムを組み直す必要があります。

例外発生をなくす①:値を先に持ってくる

例外を発生させない1つ目の方法として、hogeとHelloの位置を逆にするとnullPointerExceptionが出ないようになります。

public class JavaEquals {

    public static void main(String[] args) {
        String hoge = null;
        
        if("Hello".equals(hoge)) {
            System.out.println("Hello".equals(hoge));
        } else {
            System.out.println("Hello".equals(hoge));
        }
        System.out.println( "hogeには" + hoge + "が入っています");
    }
    
}

実行結果:

false
hogeにはnullが入っています

比較する文字列を先に持ってくることで、nullPointerExceptionの例外が出ないようになりました。その結果、“Hello”とnullを比較してfalseを返す処理ができました。

例外発生をなくす②:null判定を行う

例外を発生させない方法の2つ目として、ifで条件判定をするときにnull判定を追加することです。

public class JavaEquals {

    public static void main(String[] args) {
        String hoge = null;
        
        if(hoge != null && hoge.equals("Hello")) {
            System.out.println(hoge.equals("Hello"));
        } else {
            System.out.println(hoge != null && hoge.equals("Hello"));
        }
        System.out.println( "hogeには" + hoge + "が入っています");
    }
    
}

実行結果:

false
hogeにはnullが入っています

nullチェックをすると、どこで間違えているのか一目瞭然ですし他の人にプログラムが渡ったときにも大変分かりやすいと喜ばれます。

equalsメソッドで比較をする方法総まとめ

equalsメソッドで文字列を比較するいろいろな方法を次の記事にまとめているので、ぜひ確認してください!

まとめ

今回は、equalsメソッドの否定の判定方法、equalsメソッドの否定判定を複数用いる方法とequalsメソッドの注意点をお伝えしました。

  • 否定判定を用いるには論理演算子!(条件)
  • 否定判定を用いて複数条件を組み込むことができる
  • hoge.equals(“Hello”)においてhogeがnullの場合には例外が発生する
  • 例外は“Hello”.equals(hoge)のように値を先に持ってくることや、hoge != nullと判定することで防止できる

この4つのポイントをしっかりと理解して学習を進めてください。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次