私は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()を使用することの間に機能的な違いはありますか?ここでコンストラクターのドキュメントを確認しました:
ここにvalueOf()のドキュメントがあります:
Long.valueOf(Java.lang.String)
私が知る限り、どちらもparseLong()を呼び出すため、どちらを使用するかは問題ではありません。私はただ、もっと先の奇妙な振る舞いのために自分自身を設定していないことを確認したいだけです。また、どちらのスタイルが他のスタイルよりも「正しい」(笑)のでしょうか?
違いは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);
}
_
Long.valueOf()
を優先する必要があります:コンストラクターが行うように新しいインスタンスを構築する代わりに、よく使用される値に対してキャッシュされたLongの値を返します。
いくつかのJavaバージョンがキャッシュを使用しない場合でも、将来のバージョンではvalueOf()
を使用することで可能になりますが、コンストラクターは常に新しいインスタンスを作成します。
両方とも内部で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.
同じ意味
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);
}
これは、Eclipseで実行されるPMDプラグイン出力です
チェックしたコードは
Long l = new Long("123456");
JDK 1.5では、new Long()を呼び出すとメモリが割り当てられます。 Long.valueOf()はよりメモリに優しいです。
longsでオーバーロードされたアプリケーションのキャッシュの範囲とサイズを変更する方法を考えています。
このような変更はj2se apiではサポートされていません。1つの方法は、ロードされたJavaバイトコードをClassLoaderまたはJVMTIで変更することです
または、外部キャッシュを作成し、静的なcachedValueOf()を直接作成することもできますが、アプリケーションのニーズではないコードはニースではありません