おしえてあげるもん!
文字を比較したいんだけど、「==」を使っても文字が比較できないよー!
どーして?
文字を比較するときは、「equals」を使うもん!
なんで「==」はダメなのー?
それについて説明していくもん!
コツコツ太郎君が書いたソースはこれだ!
String str1 = "kotsukotsutaro"; String str2 = "kotsukotsu"+"taro"; if (str1 == str2) { System.out.println("文字は一緒です"); } else { System.out.println("文字は違います");//←こちらが実行される。 }
str1もstr2も同じ文字列の「kotsukotsutaro」が入っているはずなのに、実行したら「文字は違います」となるのはなんでだろう?
一見同じ文字列なので、「文字は一緒です」と出そうですよね?
しかし、実際は「文字は違います」と表示されてしまいます。
ここにはちょっと難しいですが、プリミティブ型か、参照型かという分類によるところなのです。
簡単に説明するとプリミティブ型の変数は、値そのものを表し、参照型の変数は値が置いてある場所を保持します。
String型は参照型の変数なので、コツコツ太郎君のソースのように「==」で比較する場合、文字列の場所を比較します。
文字列の場所はそれぞれ違うので、「文字は違います」と表示されるのです。
文字列を比較する時は「equals」を使おう!
コツコツ太郎君のソースを「equals」で書くと・・・
String str1 = "kotsukotsutaro"; String str2 = "kotsukotsu"+"taro"; if (str1.equals(str2)) { System.out.println("文字は一緒です");//←こちらが実行される。 } else { System.out.println("文字は違います"); }
細かいところはよくわからなくても、結局文字列比較する時は「equals」使えばいいんだね!
と覚えてもらってたら大丈夫です!
しかし注意点があります。
String str1 = null; String str2 = "kotsukotsutaro"; if (str1.equals(str2)) { System.out.println("文字は一緒です"); } else { System.out.println("文字は違います"); }
上のプログラムを実行すると以下のようにNullPointer例外が起きてしまいます。
それはどうしてでしょう?
Exception in thread "main" java.lang.NullPointerException
それは、Nullが入っているstr1の値を取得しようとしますが、Nullなので値が取得できず例外が発生してしまうのです。
なのでこういう場合は、定数を「equals」の前に書いてください。
こうすることで例外は起きません。
String str1 = null; String str2 = "kotsukotsutaro"; if (str2.equals(str1)) { //nullとならない値を「equals」の前に書く System.out.println("文字は一緒です"); } else { System.out.println("文字は違います");//←こちらが実行される。 }
Objects.equals()
また、Objects.equals()を使う方法もあります!
これは比較する文字列のどっちかがNullでもNullPointer例外は出ないので、こちらを使うことをオススメします!
import java.util.Objects;をインポートして使ってください、
String str1 = "kotsukotsutaro"; String str2 = "kotsukotsu"+"taro"; if (Objects.equals(str1, str2)) { System.out.println("文字は一緒です");//←こちらが実行される。 } else { System.out.println("文字は違います"); }