潜伏バグからのロングフリーズ

Javaっぽいエンジニアの徒然草

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()を使った方がパフォーマンスが少しだけ良い。

 

以上。