30

私は 2 人の異なる人によって書かれたコードを統合していますが、String 値を Long にキャストする方法が 2 種類あることに気付きました。

Coder #1 はこれを行いました:

String strId = "12345678";
...
Long lId = new Long(strId);

コーダー#2がこれを行っている間:

String strId = "12345678";
...
Long lId = Long.valueOf(strId);

機能的には、コードはまったく同じように動作します。NumberFormatExceptionスローされたものを処理するために、各ビットの周りに try/catch ブロックがあります。入力文字列値は、10 進数を表す 8 桁の文字列です。"12345678"どちらの場合も、正しく変換されLongます。

コンストラクターで文字列を渡すことと、Long.valueOf() を使用することの間に機能上の違いはありますか? ここでコンストラクターのドキュメントを確認しました:

Long(java.lang.String)

および valueOf() のドキュメントは次のとおりです。

Long.valueOf(java.lang.String)

私が知る限り、どちらも parseLong() を呼び出すので、どちらを使用しても問題ありません。私はただ、道の先で奇妙な行動を起こさないように自分自身を設定していないことを確認したいだけです. また、どちらのスタイルの方がより「正しい」(笑) のでしょうか。

4

6 に答える 6

29

違いは、を使用new Long()すると常に新しいオブジェクトが作成されるのに対し、を使用すると、値がの間にある場合Long.valueOf()のキャッシュされた値が返される可能性があることです。long[-128 to 127]

したがって、Long.valueOfメモリを節約できる可能性があるため、メソッドを選択する必要があります。

のソースコードが表示されている場合はLong.valueOf(String)、内部でを呼び出しますLong.valueOf(long)。そのソースコードを以下に投稿します。-

public static Long valueOf(String s) throws NumberFormatException
{
    return Long.valueOf(parseLong(s, 10));
}

public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache 
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}
于 2012-10-30T18:23:23.923 に答える
8

Long.valueOf()コンストラクターが行うように新しいインスタンスを構築する代わりに、よく使用される値に対して Long のキャッシュされた値を返します。

一部の Java バージョンがキャッシュを使用しない場合でも、使用valueOf()すると将来のバージョンで使用できるようになりますが、コンストラクターは常に新しいインスタンスを作成します。

于 2012-10-30T18:22:00.133 に答える
3

どちらもparseLong(String, int)内部的に実行されますが(intは10の値の基数です)、valueOf以下に示すように利点があります。

If a new Long instance is not required, this method should generally be used in preference to the constructor Long(long), as this method is likely to yield significantly better space and time performance by caching frequently requested values.

于 2012-10-30T18:23:16.243 に答える
3

同じ意味です

public static Long valueOf(String s) throws NumberFormatException{
        return new Long(parseLong(s, 10));
}

public Long(String s) throws NumberFormatException {
    this.value = parseLong(s, 10);
}

ソース JDK 6.0

于 2012-10-30T18:20:22.693 に答える
0

これは、Eclipseで実行されるPMDプラグイン出力です。

私がチェックしたコードは

Long l = new Long("123456");

JDK 1.5では、new Long()を呼び出すとメモリが割り当てられます。Long.valueOf()は、よりメモリフレンドリーです。

于 2012-10-30T18:23:47.637 に答える
0

Longs でオーバーロードされたアプリケーションのキャッシュの範囲とサイズを変更する方法を考えています。

そのような変更は j2se api ではサポートされていません 1 つの方法は、ロードされた Java バイト コードを ClassLoader または JVMTI で変更することです (外部チューニングのように、そのようなトリックをプロジェクトから除外できます)。

または、外部キャッシュを作成し、単純な static cachedValueOf() を所有することもできますが、アプリケーション以外のニーズに依存するコードは適切ではありません

于 2014-04-22T10:38:26.450 に答える