DBWordPressLinuxChromeWebツールブログTop2013年5月29日javaのオブジェクト型(Integer)を==比較すると危険!javaにはオブジェクト型とプリミティブ型の変数があります。オブジェクト型で==を使うと予期せぬ動きをする場合があります。数値を比較する場合は、プリミティブ型は==を使って、オブジェクト型はequalsを使うようにしましょう。今回はどのような落とし穴があるのかについて紹介します。[スポンサーリンク]典型的なダメパターンこのパターンは、皆さんもよくご存じだと思います。newインスタンス化したオブジェクト同士の比較です。結果は予想通り、「等しくない」です。これはオブジェクトのアドレスを比較していることが原因ですね。等しくない==比較がOKなパターンnewインスタンスをせずに、直接数値を入れたパターンです。これは、「等しい」です。java5から登場しました、オートボクシングによって、java内部でInteger.valueOf(1)に自動変換してくれているので、==比較が可能となります。等しい==比較がNGなパターン先ほどと同じで数値を直接入れるパターンです。結果は、「等しくない」です。これは予想と反したのではないでしょうか?これは、-128から127までの間の数値は、java内部で同一オブジェクトが使われて、Integer.valueOf(1)に自動変換してくれます。Integer(1)で別オブジェクトへインスタンス化されるため、==比較ではNGとなります。等しくないまとめIntegerに直接数値を入れるパターンは、-128から127までの間の数値は、==で比較OKです。-128から127の範囲外は、==で比較NGです。数値の大きさによってif判定も変わってくるので、Integerオブジェクトを==比較するのはやめましょう!最後に以上が、オブジェクト型(Integer)を==で比較することのリスクです。数値の幅によってプログラムがある日突然動かなくなることがあります。テストも終わって本番環境に乗せたら・・・・。なんてことになる前にしっかりと予防しましょう!それでは!TweetPocket[スポンサーリンク]最後まで読んでいただきありがとうございます!この記事はお役に立てましたか?お役に立てたことがあればシェアしていただけると嬉しいです!TwitterFacebookPocketはてブGoogle+Feedly関連している記事をピックアップしました!こちらの記事もあわせて読んで頂ければ嬉しいです。