Androidアプリエンジニアのゆーちゃまさんです^^
当サイト「ドロイドブログ」を運営しています。
javaでWebアプリ開発を2~3年、その後Androidアプリを10年以上開発しています^^
javaの勉強を始めたころは…
- 文字列の比較はequalsメソッドを何でつかうの?
- == で判定してはいけないってどうしてだろ?

こんな疑問をもってました。
この記事で、とても大事なequalsメソッドで比較する理由がわかります!
とっても大事なことなので、早めに理解しておくことが大切!
分かりやすく解説します^^
結論:文字列はオブジェクト型なので変数にはアドレスが入っている
equalsメソッドを利用するたった1つの理由
equalsメソッドは、文字列が等しいかどうかを判定するメソッド。
「==」等価演算子は、オブジェクトが等しいかどうかを判定するもの、文字列比較では使えない。
文字列はオブジェクト型ですので、newをして実体化します。
1 2 | Stringstr1="文字列その1"; Stringstr2=newString("文字列その1"); |
1行目では、「new」をしないで直接ダブルクォーテーションでくくった「文字列その1」を、変数「str1」に代入していますが、省略して記述できるだけで裏でnewをしています。
2行目と同じです。


この2行のコードを図にするとこのような形になります!
- 「メモリ」とは
- パソコンが処理するときの、「作業場」です。
「机の上」に例えられます。
図では青い部分がメモリ:作業場の机の上になります。 - 「アドレス」とは
- 文字どうり、住所です。
1行目で作成した文字列「文字列その1」がメモリ上のどこにあるかの住所。
図では「1丁目」の住所に存在しています。
同じく、2行目で作成した文字列「文字列その1」はメモリ上の住所「2丁目」に存在しています。
メモリ上に、実際に作成した文字列が存在しているわけですね。
変数は箱に例えられます。
では中身は何がはいっているのでしょうか?
変数(箱)に入っているのは、メモリ上にある1行目・2行目で作成した文字列が置かれている「住所」が入っています。
チェックポイント
変数(箱)に入っているのは、実際の値ではなくてアドレス(住所)が入っている
実際に「==」を使用して文字列の比較をする

では、実際にまず「==」で2つの変数を比較してみましょう!
1 2 3 4 5 6 7 8 9 | Stringstr1="文字列その1"; Stringstr2=newString("文字列その1"); // ==で比較 if(str1==str2){ System.out.println("str1とstr2は等しい"); }else{ System.out.println("str1とstr2は等しくない"); } |
実行結果
System.out: str1とstr2は等しくない
5行目「str1 == str2」で比較しています。
実行結果は「等しくない」と表示されました。

str1、str2 ともに「文字列その1」と同じ文字列なのに、どうして「等しくない」と判定されるのでしょうか??
チェックポイント
「==」等価演算子での比較は、同じオブジェクトかどうかを判定している
どういう事でしょう?
str1に入っているアドレスは「1丁目」 ⇒ 1丁目にある文字列「文字列その1」
str2に入っているアドレスは「2丁目」 ⇒ 2丁目にある文字列「文字列その1」
1丁目と2丁目に存在する、別のオブジェクトであることが分かります。
結果、オブジェクト自体はそれぞれ別の場所にある別のもの。
str1とstr2は「別々のオブジェクト、同じではないです」と判定。
等しくないため「false」がかえって来て「str1とstr2は等しくない」と表示される。

Aさんの家にある「コカ・コーラ」と、Bさんの家にある「コカ・コーラ」は同じコカ・コーラですが、別々の家に存在する別のコカ・コーラですよね?これと同じことです。
equalsメソッドで比較する

では、同じオブジェクトかどうかでは無くて、「同じ文字列」かどうかを比較判定するにはどうすればよいか?equalsメソッドで判定しましょう!
1 2 3 4 5 6 7 8 | Stringstr1="文字列その1"; Stringstr2=newString("文字列その1"); if(str1.equals(str2)){ System.out.println("str1とstr2は等しい"); }else{ System.out.println("str1とstr2は等しくない"); } |
実行結果
System.out: str1とstr2は等しい

「等しい」と表示されました!これは、同じオブジェクトかどうかを判定しているのではなく、「同じ文字列かどうか」を判定してくれるメソッドだからです。
チェックポイント
Stringクラスの「equals」メソッドは、「文字列じたいが同じかどうか」を判定するメソッド
開発している場合、同じ文字列かどうかの判定は、すごく使います!
とても大事なので、なぜequalsメソッドを利用して比較するのかを理解しておきましょう!
まとめ
- オブジェクト型の変数に入っているものは、メモリ上の住所(アドレス)
- 「==」投下演算子での比較は、同じオブジェクトかどうかを判定
- 「equals」メソッドは、「同じ文字列かどうか」を判定する
この3点は、プログラミングをしていく上で基礎ですがとても大事なことです。
これをあやふやにしたままプログラミングの勉強を勧めてしまうと、後々こまることになります。
あやふやな状態ではなく、しっかり理解しちゃいましょう!
こちらの記事もどうぞ^^
⇒ ⇒ ⇒ 【java map】Mapの使い方、使いどころを実例で解説
⇒ ⇒ ⇒ 【java 配列の基礎】配列はこれだけ覚えておけばOK!徹底解説
⇒ ⇒ ⇒ 【pagespeed insights 改善】2021年度版 モバイルスピードを速くするためにやった3つのこと
コメント