![](/img/trans.png)
[英]Why is Long.valueOf(0).equals(Integer.valueOf(0)) false?
[英]Why use Long.valueOf(…) rather than a long literal?
最近我偶然發現了人們寫東西的代碼
Long myLong = Long.valueOf(42);
// instead of
Long myLong = 42L;
我不知道為什么會這樣做,除了有關可讀性的個人品味。
我錯過了什么嗎?
使用直接賦值,如果將int
賦值為Long
( int
to primitive long
is implicit),則autoboxed
進行Long.valueOf
並使用Long.valueOf
自動進行自動Long.valueOf
Long myLong1 = Long.valueOf(42);
Long myLong2 = Long.valueOf(42L);
Long myLong3 = 42L;
Long myLong4 = (long) 42;
否則它們都是相同的從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
)
瑣事:如果是整數和Oracle JVM,可以使用-XX:AutoBoxCacheMax=
控制范圍-XX:AutoBoxCacheMax=
片段
Long myLong = 42L;
在內部是相同的
Long myLong = Long.valueOf(42);
編譯器將生成相同的字節碼。
我也認為這是java5之前的java的提醒,其中沒有自動裝箱,以及在哪里
Long l = 42L;
無法編譯。
它們是等價的,編譯器將為兩者構建相同的字節碼
valueOf
需要一個原始的long
。 對於文字,我同意42L
更好,但如果你有一個int
或long
變量, Long.valueOf
是獲得Long
的好方法。 valueOf
還使用-128到127之間的緩存,這使得它在常見值的new Long(long)
具有輕微的性能優勢。
沒有意識到你可以通過其他方式做到的人?
我不得不懷疑編譯器是否足夠聰明,可以將Long.valueOf轉換為相同的字節碼,以進行常量調用。 否則會有一個微小的性能損失(不重要,但你可能會注意到它運行嚴重,緊密的循環)。
valueOf版本對於安全地轉換原始值非常有用,如果你在原始類型之間進行一系列強制轉換並且不希望(例如)導致問題,那么它很方便:(int)longBiggerThanIntCanHandle
(你不會關心做(長)intValue,但是如果你在兩種方式都做了很多轉換,那么為了安全起見,最好使用valueOf作為約定。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.