はじめに
他人のソースコードを眺めていたら、文字列から数値への変換をする際に
Integer.parseIntとInteger.valueOf
が出てきて「そーいえば違いなんだったかな?」と思ったのでメモしようとしたのがきっかけ。
それぞれの違い
戻り値が違う
見出しの「戻り値が違う」。それに限りますね。
- parseInt:int
- valueOf:Integer
プリミティブ型を返すかラッパークラスを返すかの違いですね。
変換後に使用するデータがプリミティブ型であるなら、parseIntが適切ということです。
使用するデータがプリミティブ型でも、valueOfは動作はしますし、結果も変わらないですが、Unboxingが走ることになります。
逆もしかり、なので、以下にサンプルコードを書いておきます。
class Sample {
public void main(String[] args) {
// それぞれ、適切な型に合わせてメソッドを使っている例
int num1 = Integer.parseInt("1");
Integer num2 = Integer.valueOf("1");
// 動作はするけど、Java仕様に則って変換処理が動作する。
// autoboxingが発生する
Integer num3 = Integer.parseInt("1");
// unboxingが発生する。
int num4 = Integer.valueOf("1");
}
}
処理の中身も違う
と見出しに書きましたが、大きな違いはありません。なぜなら
valueOfは、メソッド内で「parseInt」を呼び出して数値変換を行っているから。
Integerクラスのソースコードをご覧いただければわかりますが、valueOfの中でparseIntを呼び出し、parseIntの結果を使ってIntegerクラスのインスタンスを作っています。
※なので、parseInt + αのコードがある分、valueOfは速度面でも若干劣るということですね。微々たるものですが。
最後に
慌ててコーディングしているときなど、あまり意識せずに思いついた方を選択してしまうことがありますが、そういう時こそ一息ついて
「これはどういう違いがあるのだろう?似ているけどどちらが適切だろうか?」
を考えながらコードを書いていけるように日々精進ですね。
参考文献
IntegerクラスのAPI(parseInt, valueOf)
Integer (Java SE 11 & JDK 11 )
オートボクシング(autoboxing)
Autoboxing
コメント