【Java】Stringからintへの変換について
はじめに
Stringからintへの変換方法はいくつかある。よく使われるのは以下の手法だろうか。●Integer.parseInt(String)を使う。
●Integer.valueOf(String)でIntegerオブジェクトを生成 ⇒ intValueメソッドを実行する。
どちらでも変換自体はできるが、前者が推奨される。理由は、FindBugsにかけたとき、後者だとPriority:Highで引っかかるためである。
サンプル
Integer.parseInt(String)を使うint num = Integer.parseInt("123");
・文字列「123」がint型の「123」になって変数numに格納される。
Integer.valueOf(String)でIntegerオブジェクトを生成&intValue()でプリミティブ型を返す
int num = Integer.valueOf("123").intValue();
・まず、文字列「123」がIntegerオブジェクトに変換される。
・そしてIntegerクラスが提供するintValue()メソッドによってIntegerからintにアンボクシングされて変数numに格納される。
どちらでもStringからintに変換できるしコンパイルも通るが、後者はFindBugsにかけたときにPriority:Highで引っかかる。
バグの内容は、Boxing/unboxingに関するものである。
後者だと効率が悪いから、parseInt()メソッドで直接intに変換しろよ、ということだろうか。
FindBugsのBugInfoを見ると、「parseXXXメソッドを使いましょう」的なメッセージが表示される。
おわりに
結論としては、Stringからintに変換するときはparseInt()メソッドを使った方がよい、ということ。(intに限らず、Stringからdoubleやlongといったプリミティブ型に変換するときは、parseXXXメソッドを使った方がよい)確かに、「String -> Integer -> int」と回りくどい方法よりも、「String -> int」に直接変換できる仕組みがあるのだから、それを利用した方が効率がよいとは思う。(プログラムのパフォーマンスに影響してくるのかな?)
参照
Integer (Java Platform SE 7)
文字列から数値への変換 - ラッパークラスを使った文字列と数値の変換 - Java入門
java - Findbugs issue with "Boxing/unboxing to parse a primitive" with Integer.valueOf(String) - Stack Overflow