【Java入門】文字列を比較する場合に気をつけること

【Java入門】文字列を比較する場合に気をつけることJava入門
スポンサーリンク

こんにちは!しーま(@s59shima)です。

いつもブログをご覧いただきありがとうございます。

今回は、こんな悩みや疑問のある方に向けて記事を書きました。

文字列を比較するチェック処理を実装したけど、うまくいかない。なんで!?

イコール(==演算子)とequalsメソッドの違いについて詳しく知りたい方にはオススメの記事です。

IT系フリーランス専門エージェントサービス第1位のMidWorksは業界トップクラスの低マージンで多くのエンジニアから選ばれています!!

文字列の比較はequalsを使用

結論から言うと、Javaで値を比較して等しいかどうかを調べるにはequalsメソッドを使用します。

オブジェクトが等しいかどうかではなく、値が等しいかどうかを調べる時にequalsメソッドを使用します。お間違えのないように!

equalsメソッドを使用して判定した結果、等しければ真(true)、等しくなければ偽(false)になります。

Java8 – StringクラスのAPIドキュメントを確認してみましょう。

StringクラスのAPIドキュメントを確認

引用元:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#equals-java.lang.Object-

文字列の比較をequalsで判定した場合

サンプルコード

Javaという文字列を格納した変数arg1を用意し、equalsメソッドで比較するサンプル。

public class Sample {
    public static void main( String[] args ) {

        String arg1 = new String("Java");
        String arg2 = new String("Java");

        if ( arg.equals( arg2 ) ) {
            System.out.println( "Yes" );
        } else {
            System.out.println( "No" );
        }
    }
}

実行結果

7行目のifブロックの中を通ることを確認できました。

実行結果:Yes

文字列の比較をイコール(==)で判定した場合

サンプルコード

上記のサンプルコードを変更します。equalsメソッドではなく、イコール(==)演算子に書き換えてみましょう

public class Sample {
    public static void main( String[] args ) {

        String arg1 = new String("Java");
        String arg2 = new String("Java");

        if ( arg1 == arg2 ) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}

実行結果

変数argにJavaという文字列を格納しているにも関わらず、9行目のelseブロックを通ることを確認できました。

実行結果:No

期待する結果とはなりませんでした。equalsとイコール(==)の違いについて確認していきましょう!

equalsとイコール(==)の違い

比較の仕組み -> equalsメソッド

変数arg1・arg2に共に「Java」という文字列を格納しています。データ同士を比較したい場合は、equalsメソッドを使用します。

そうすることでStringオブジェクトに格納されているデータ(値)を参照するので、「同じである」と判定ができるのです。

比較の仕組み -> イコール( == )演算子

一方で、イコール(==)演算子を見てみましょう。こちらはStringオブジェクト同士を比較していますよね。データ(値)を参照していませんね。

arg1・arg2共にインスタンスを生成しているので、異なるオブジェクトとなります。そのため、「同じではない」という判定になるのです。

equalsメソッドは全てのオブジェクトで使用可能

equalsメソッドはStringクラスだけではなく、全てのオブジェクトクラスに存在するメソッドです。

例えば、IntegerクラスやDoubleクラスにもequalsメソッドは存在します。

equalsはオブジェクトがNullだと例外が発生

全てのオブジェクトで使用可能と言いましたが、注意点が1つあります。

オブジェクト自体がNullの場合、equalsメソッドは使用できません。(例外が発生する)

サンプルコード

変数arg1をnullにし、equalsメソッドを使用した場合の実行結果を確認してみます。

public class Sample {
    public static void main( String[] args ) {

        String arg1 = null;
        String arg2 = new String("Java");

        if ( arg1.equals( arg2 ) ) {
            System.out.println( "Yes" );
        } else {
            System.out.println( "No" );
        }
    }
}

実行結果

Exception in thread “main” java.lang.NullPointerException

equalsメソッドを使用する場合は、対象のオブジェクトがNullではない事を事前に確認した上で使用しましょう!

compareTo(大なり・小なり)でも比較は可能

値の比較はequalsメソッド以外にもcompareToメソッドでも可能です。2つとも比較ですが、戻り値が異なります。

equalsメソッドの戻り値はboolean型でtruefalseの2つです。

compareToメソッドの戻り値はint型で「-1」か「0」か「1」の3パターンあります。

compareToメソッドの使いどころとしては、比較してどちらが大きいか・小さいかを判定するような場合に有効と考えられます。

サンプルコード

今度はIntegerクラスを例にします。変数arg1とarg2に100という値を代入します。

compareToメソッドを使用してみます。

public class Sample {
    public static void main( String[] args ) {

        Integer arg1 = new Integer("100");
        Integer arg2 = new Integer("100");

        if ( arg1.compareTo( arg2 ) > 0 ) {
            System.out.println( "arg1が大きい値" );
        } else if ( arg1.compareTo( arg2 ) == 0 ) {
            System.out.println( "arg1とarg2は同じ値" );
        } else {
            System.out.println( "arg2が大きい値" );
        }
    }
}

実行結果

変数arg1とarg2の値は共に100なので、else ifブロックに入りましたね。

実行結果:arg1とarg2は同じ値

下記のような結果になります。
arg1 > arg2 の場合 compareToメソッドの戻り値は「1」
arg1 == arg2 の場合 compareToメソッドの戻り値は「0」
arg1 < arg2 の場合 compareToメソッドの戻り値は「-1」

まとめ

今回は、文字列を比較する方法について解説しました。

最後まで読んでいただきありがとうございました(*^-^*)

本記事をまとめると以下の通りです。

  • 文字列の比較はequalsメソッドを使用
  • イコール(==演算子)はオブジェクト同士の比較
  • compareToメソッドでも比較は可能。但し、戻り値はequalsメソッドと異なる。

IT系フリーランス専門エージェントサービス第1位のMidWorksは業界トップクラスの低マージンで多くのエンジニアから選ばれています!!

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました