は最近、私は人々が私は1つは、読みやすさに関する個人的な好みを除いて、これを実行する理由見当もつかないなぜ長いリテラルではなく、Long.valueOf(...)を使用するのですか?
Long myLong = Long.valueOf(42);
// instead of
Long myLong = 42L;
ようなものを記述したコードの上につまずきました。
何か不足していますか?
は最近、私は人々が私は1つは、読みやすさに関する個人的な好みを除いて、これを実行する理由見当もつかないなぜ長いリテラルではなく、Long.valueOf(...)を使用するのですか?
Long myLong = Long.valueOf(42);
// instead of
Long myLong = 42L;
ようなものを記述したコードの上につまずきました。
何か不足していますか?
直接割り当てが必要ですint
をLong
(int
からプリミティブlong
までを暗黙に指定)に割り当てるとキャストし、g自動的Long.valueOf
Long myLong1 = Long.valueOf(42);
Long myLong2 = Long.valueOf(42L);
Long myLong3 = 42L;
Long myLong4 = (long) 42;
を使用してらautoboxed
は、そうでない場合は、すべてのjavap
public static void main(java.lang.String[]);
Code:
0: ldc2_w #16 // long 42l
3: invokestatic #18 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
6: astore_1
7: ldc2_w #16 // long 42l
10: invokestatic #18 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
13: astore_2
14: ldc2_w #16 // long 42l
17: invokestatic #18 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
20: astore_3
21: ldc2_w #16 // long 42l
24: invokestatic #18 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
27: astore 4
29: return
からバイトコード出力は、しかしnew Long(42L)
を使用すると、同じ避けるべきで参照されていない場合は絶対に必要と上記の文の一つが使用する必要がありますvalueOf
の方法では、内部的にJVMによって値の範囲(FlyWeight Design Pattern
)をキャッシュします。
トリビア:整数の場合は限り-XX:AutoBoxCacheMax=
@chrylisはい購入しないオートボクシング。 http://docs.oracle.com/javase/6/docs/api/: ' –
valueOf
は、プリミティブlong
をとります。リテラルについては、42L
がより良いことに同意しますが、int
またはlong
という変数がある場合は、Long.valueOf
はLong
を得る良い方法です。 valueOf
は-128から127までの値のキャッシュも使用します。これにより、一般的な値に対してはnew Long(long)
より若干パフォーマンスが向上します。彼らが等価である
プリミティブなロング変数で代入を使うこともできます。それでも同じでなければなりません( 'Long myLong = myPrimitiveLong;') – Puce
@Puce hm、良い点。しかし、Long.valueOf(myPrimitive).compareTo(otherPrimitive)のように、 'Long'でインスタンスメソッドを呼びたい場合には、これはまだ便利です。他の何らかの理由で、必ずしもプリミティブに割り当てる必要はなく、 'Long'を必要とします。 –
は、コンパイラは同じバイトコードを生成します
Long myLong = Long.valueOf(42);
コンパイラとして両方
それは本当ですか? –
@DavidWallaceはい答えに 'javap'の出力を見てください。 –
ため
Long myLong = 42L;
が内部的に同じであるスニペットを同じバイトコードを構築します。
あなたが気づいていない人は、他の方法でそれをすることができますか?
コンパイラが定数呼び出しのために同じバイトコードにLong.valueOfを変換するほどスマートであるかどうか疑問に思っています。さもなければ、小さなパフォーマンス・ヒット(重要ではありませんが、頻繁に実行され、タイトなループに気付くかもしれません)。 (INT)longBiggerThanIntCanHandle
:のvalueOfのバージョンでは、プリミティブ型間のキャストの束をやっているし、(例えば)問題を引き起こすことにしたくない場合に便利、安全にプリミティブ値をキャストするのに便利です
(あなたは(long)intValueを気にしませんが、両方の方法でコンバージョンを行う場合は、安全のためにvalueOfを規約として使用することをお勧めします)
を使用して制御することができ&のOracle JVM範囲。valueOfメソッドは、頻繁に要求される値をキャッシュすることで、より優れた領域と時間のパフォーマンスを実現します。 Long.valueOfは-128〜127の値をキャッシュし、これらの値は再利用できます。
割り当ての場合、毎回新しいオブジェクトが作成されます。
valueOfメソッドは文字列の場合には動作が異なります。
参照のPrashant Bhate – Puce
おそらく彼らは '42L'構文を認識していないからです。 –
おそらく著者は長いリテラルについて知らなかったでしょう。あなたが使用する場合 – Henry
何が起こることは、あなたが「オブジェクト」の本能で行くである「ロング」そうメソッドを使用する傾向があり、プラス@MagnusGrindalBakkenが言ったことと同じで、私は私の自己はそれを試したことがない:私たちはへのFindBugsを使う仕事P –