20130202

Javaの話

 

String str1 = new String("hoge");

String str2 = new String("hoge");

 

System.out.println(str1 == str2); //falseを返す

 

これはよく知られている話

"=="は変数に代入された値を比較するのだが, str1, str2にはそれぞれ

Stringクラスのインスタンス, つまりそれぞれ文字列"hoge"のメモリ上の位置が代入されている

メモリ上の位置がそれぞれ異なっているので上のprintlnは常にfalseを返す

 

そこで, 文字列の比較にはequals()という関数を使ってあげる

System.out.println(str1.equals(str2)); //true

equalsはメモリ上の位置ではなくオブジェクトの中身を比較する

"hoge" == "hoge"よりtrueが帰る

 

じゃあ定数と比べるときは次のどちらが良い書き方だろう

1. str1.equals("hoge")

2. "hoge".equals(str1)

 

なんとなく1で書いている人が多いのではないだろうか

1の場合, もしstr1がnullだった場合にはequalsというメソッドは

もちろん存在しないのでExceptionが発生する

一方2の場合は"hoge"というオブジェクトにはequalsメソッドがあるため

たとえstr1がnullでも"hoge"とnullの比較でExcptionは発生しない

 

1の書き方を使うとすると

if (str1 !== null && str1.equals("hoge")) { }

またはtry catchで囲むという方法はあるが, 無駄な処理をなくすために

2の書き方をしてみてはどうだろうか

 

基礎的な内容でした