はじめに
久しぶりにAndroidを触っていて軽くハマったので備忘録として残します。
「==」のString比較は決してtrueにならない
String a = "Hello";
String b = "Hello";
if(a == b) {
Log.i(TAG, "aとbは同じ");
} else {
SLog.i(TAG, "aとbは違う");
}
結果は必ずfalseになります。
ロジックは合っているはずなのに何でだろうかとしばし考えてしまいます。(ました。。)
Stringの比較はequalsを使う
そのままですが、以下のようにして比較しましょう
String a = "Hello";
String b = "Hello";
if(a.equals(b)) {
Log.i(TAG, "aとbは同じ");
} else {
SLog.i(TAG, "aとbは違う");
}
結果はTrueとなります。めでたしめでたし。
なぜ「==」ではダメなんだろうか?
int,charなどの先頭が小文字のものはプリミティブ型(基本データ型)と言われておりjavaの言語仕様に元々含まれているそうです。
それに対してJavaにおける文字列、つまりStringはクラス型変数というもので、javaのAPIで定義されているものです。
でもってクラス型変数は参照渡しとなっており、メモリに保持している場所を渡しているとのこと。
「==」で参照先同士を比較しても比較しているのは参照先で合ってその中身ではありません。そのため一致するわけがありません。
さいごに
なるほどではあるのですが、、これは非常にめんどくさい

コメント