web-dev-qa-db-ja.com

Long.valueOf(Java.lang.String)と新しいLong(Java.lang.String)の違いは?

私は2人の異なる人々によって書かれたコードを統合しており、文字列値をLongにキャストすることは2つの異なる方法で行われていることに気付きました。

コーダー#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()を呼び出すため、どちらを使用するかは問題ではありません。私はただ、もっと先の奇妙な振る舞いのために自分自身を設定していないことを確認したいだけです。また、どちらのスタイルが他のスタイルよりも「正しい」(笑)のでしょうか?

28
AWT

違いは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);
}
_
27
Rohit Jain

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

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

8
JB Nizet

両方とも内部で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.

3
Yogendra Singh

同じ意味

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.

3
Arun Manivannan

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

チェックしたコードは

Long l = new Long("123456");

JDK 1.5では、new Long()を呼び出すとメモリが割り当てられます。 Long.valueOf()はよりメモリに優しいです。

0
Suranga

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

このような変更はj2se apiではサポートされていません。1つの方法は、ロードされたJavaバイトコードをClassLoaderまたはJVMTIで変更することです

または、外部キャッシュを作成し、静的なcachedValueOf()を直接作成することもできますが、アプリケーションのニーズではないコードはニースではありません

0
Yegor Parusymov