为什么使用Long.valueOf(...)而不是长文字?

时间:2013-08-30 11:48:19

标签: java

最近我偶然发现了人们写

之类的代码
Long myLong = Long.valueOf(42);

// instead of

Long myLong = 42L;

我不知道为什么会这样做,除了有关可读性的个人品味。

我错过了什么吗?

6 个答案:

答案 0 :(得分:16)

直接分配如果将int分配给Longint到原始long是隐含的),则需要进行投射,并且他们会自动使用autoboxed 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方法通常会缓存一系列值(FlyWeight Design Pattern)由JVM内部

琐事:如果是整数& Oracle JVM可以使用-XX:AutoBoxCacheMax=

来控制范围

答案 1 :(得分:4)

摘录

Long myLong = 42L;

在内部与

相同
Long myLong = Long.valueOf(42);

编译器将生成相同的字节码。

答案 2 :(得分:2)

它们是等价的,编译器将为两个

构建相同的字节码

答案 3 :(得分:2)

我也认为这是java5之前的java的提示,其中没有自动装箱,而且

Long l = 42L; 

无法编译。

答案 4 :(得分:1)

valueOf采用原始long。对于文字,我同意42L更好,但如果你有intlong变量,Long.valueOf是获得Long的好方法}。 valueOf还使用-128到127之间的值缓存,这使得它在new Long(long)上的公共值略有性能优势。

答案 5 :(得分:1)

没有意识到你可以通过其他方式做到的人?

我不得不怀疑编译器是否足够聪明,可以将Long.valueOf转换为相同的字节码,以进行常量调用。否则会有很小的性能损失(不显着,但你可能会注意到它运行严重,紧密的循环)。

valueOf版本对于安全地转换原始值非常有用,如果你在原始类型之间进行一系列强制转换并且不希望(例如)导致问题:  (INT)longBiggerThanIntCanHandle

(你不会关心做(长)intValue,但是如果你两种方式都做了很多转换,为了安全起见,最好使用valueOf作为约定。)