今日のJavaの授業の終わりかけに、ちょっと困ったことが発生しました。 それは「Ifによる判断が、合っているはずなのに合わない」こと。 確かに、文字列一致の判断を行うために「==」で処理してるのになぁと、 しばらくソースを見直して、首をかしげてまた見直して・・・の繰り返し。 その時に、先生の一言でパッとみんな解けたわけですね。 「文字列一致の判断は、==ではなくてequals()。」 あぁなるほどな、と。ということで、下にまとめます。 今回はこちらのサイトを参考にさせていただきました。 Javaにおける文字/文字列の扱い方 - ITアーキテクト [IT Architect] 上リンクにあることをさっぱり書くと、 「==」は「同オブジェクト参照チェック」で、 「equals()」は「同格納値チェック」です。 「==」は、他言語と動作(というか判断基準)が違うので、注意が必要です。// それぞれに同じ"初期値"を与えた場合 String a1 = new String("abc"); String b1 = new String("abc"); System.out.println("それぞれに同じ\"初期値\"を与えた場合"); // == の場合 if ( a1 == b1 ) { System.out.println("◆==:True"); } else { System.out.println("◆==:False"); } // equals() の場合 if ( a1.equals( b1 ) ) { System.out.println("◆equals():True"); } else { System.out.println("◆equals():True"); } // ********************** // * 実行結果 // // それぞれに同じ"初期値"を与えた場合 // ◆==:False // ◆equals():True // **********************この場合は、a1,b1共に「同じ値」が代入されているにもかかわらず、 Javaの判断としては、「違うオブジェクトを参照」している、と取られます。 その結果、「同じオブジェクトを参照しているか」チェックする「==」はFalse、 「同じ値かどうか」チェックする「equals()」はTrueとなります。// それぞれに同じ"オブジェクト"を与えた場合 String xy = new String("xyz"); String x1 = xy; String y1 = xy; System.out.println("それぞれに同じ\"オブジェクト\"を与えた場合"); // == の場合 if ( x1 == y1 ) { System.out.println("◆==:True"); } else { System.out.println("◆==:False"); } // equals() の場合 if ( x1.equals( y1 ) ) { System.out.println("◆equals():True"); } else { System.out.println("◆equals():True"); } // ********************** // * 実行結果 // // それぞれに同じ"オブジェクト"を与えた場合 // ◆==:True // ◆equals():True // **********************このソースの場合、x1,y1は同じxyを参照しています。 よって、「==」でも「equals()」でもTrueが返されます。 今後かなり多用すると思うので、憶えておかないとですね。
ホーム > ソース > Java ==とequals()による初歩的問題について
0 件のコメント:
コメントを投稿