簡體   English   中英

為什么使用Long.valueOf(...)而不是長文字?

[英]Why use Long.valueOf(…) rather than a long literal?

最近我偶然發現了人們寫東西的代碼

Long myLong = Long.valueOf(42);

// instead of

Long myLong = 42L;

我不知道為什么會這樣做,除了有關可讀性的個人品味。

我錯過了什么嗎?

使用直接賦值,如果將int賦值為Longint 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更好,但如果你有一個intlong變量, Long.valueOf是獲得Long的好方法。 valueOf還使用-128到127之間的緩存,這使得它在常見值的new Long(long)具有輕微的性能優勢。

沒有意識到你可以通過其他方式做到的人?

我不得不懷疑編譯器是否足夠聰明,可以將Long.valueOf轉換為相同的字節碼,以進行常量調用。 否則會有一個微小的性能損失(不重要,但你可能會注意到它運行嚴重,緊密的循環)。

valueOf版本對於安全地轉換原始值非常有用,如果你在原始類型之間進行一系列強制轉換並且不希望(例如)導致問題,那么它很方便:(int)longBiggerThanIntCanHandle

(你不會關心做(長)intValue,但是如果你在兩種方式都做了很多轉換,那么為了安全起見,最好使用valueOf作為約定。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM