Long.parseLong(s)とLong.valueOf(s)の違い
タイトルはLongだけど、Integerなんかも同じ。
parseXxx()はプリミティブ型を返す。
次の場合はlongの10となる。
Long.parseLong("10");
valueOf()はラッパー型を返す
次の場合はLongの10となる。
Long.valueOf("10");
Longクラスの実装を見ていくと、parseした結果をnewして詰めていることが分かる。
Long.valueOf("10");
= new Long(Long.parseLong("10"));
違いはそれだけ。
プリミティブ型を返すからといって、
ラッパー型に入れようとしてエラーが発生することはない。
下記ケースはいずれもエラーとはならずに正常に処理される。
(1) long a = Long.parseLong("1");
(2) Long b = Long.parseLong("1");
(3) long c = Long.valueOf("1");
(4) long d = Long.parseLong("1");
----------------------------------------------
【少し考えた】
パフォーマンスを考えると、
valueOf()と比較してインスタンス生成回数を抑えられることから
プリミティブ型が欲しい場合はparseXxx()の方が良さそうに思える。
とは言っても、大量ループ処理される場合でもなければ大した差は出ないはず。
【ローカル環境で検証してみた】
どちらも一瞬で結果が返ってくる場合と、2秒以上待たされる場合があったので分けて比較。
public static void main(String args) {
long start = new Date().getTime();
for (int i = 0; i < 100000000; i++) {
long temp = Long.parseLong("1");
}
long end = new Date().getTime();
System.out.println(end - start);
}
一瞬で返った場合 : 約25ミリ秒
2秒以上待たされる場合 : 約2200ミリ秒
public static void main(String args) {
long start = new Date().getTime();
for (int i = 0; i < 100000000; i++) {
long temp = Long.valueOf("1");
}
long end = new Date().getTime();
System.out.println(end - start);
}
一瞬で返った場合 : 約130ミリ秒
2秒以上待たされる場合 : 約2400ミリ秒
【結論】
プリミティブ型使う時は、parseXxx()を使った方がパフォーマンスが少しだけ良い。
以上。