IT未経験者がJavaをやったら==とequalsでつまづいた
IT未経験者の僕は、会社の研修でJavaをやっています。
事前に「Javaは難しい」と聞いていましたが、やっぱり難しいです。
たくさんつまづきポイントはあったのですが、今回は「==」と「equals」の使い分けについて書きたいと思います。
値型と参照型はぜんぜん違う!?
値型の比較
変数valueがint型で、値が10であればtrueを返し、それ以外であればfalseを返します。
if (10 == value) { return true; } else { return false; }
なぜ?
▼「value」という箱(変数)に「10」という値が入っています。だからvalueが値型の場合「==」で比較します。
参照型の比較
変数valueがString型で、”hoge”を参照していたとしてもfalseとなる”ことがあります”。
if ("hoge" == value) { return true; } else { return false; }
参照型の中身の比較をしたい場合はequalsを使います。
if ("hoge".equals(value)) { return true; } else { return false; }
なぜ?
▼参照型は変数にアドレス値が入っています。
▼==はアドレス値の比較となるので意図しない結果になります。だから参照型の中身の比較はequalsを使います。
最後に
String型の場合、JVMの最適化によって同じ文字列は同じアドレスとなることが多いそうです。そのため==では意図しない結果になる”ことがある”と書きました。
String型以外の参照型はもちろんですが、String型の比較であえてequalsを使わない理由はないので、ちゃんと使い分けましょう。