23

最近我偶然发现了人们写的代码,比如

Long myLong = Long.valueOf(42);

// instead of

Long myLong = 42L;

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

我错过了什么吗?

4

6 回答 6

19

使用直接分配,如果分配intLongint原语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)如果不是绝对必要,则应避免使用,并且需要使用上述语句之一来支持这一点,因为方法通常会在 JVM 内部valueOf缓存一系列值( )FlyWeight Design Pattern

琐事:在整数和 Oracle JVM 的情况下,可以使用来控制范围-XX:AutoBoxCacheMax=

于 2013-08-30T11:58:00.120 回答
4

片段

Long myLong = 42L;

内部相同

Long myLong = Long.valueOf(42);

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

于 2013-08-30T11:56:04.247 回答
3

我也觉得是对java5之前的java的提醒,没有自动装箱,在哪里

Long l = 42L; 

无法编译。

于 2013-08-30T12:23:25.337 回答
2

它们是等价的,编译器将为两者构建相同的字节码

于 2013-08-30T11:52:19.240 回答
1

valueOf需要一个原始long. 对于文字,我同意这42L更好,但如果你有一个intorlong变量,Long.valueOf这是获得Long. valueOf还使用从 -128 到 127 的值的缓存,这使得它在常见值方面具有轻微的性能优势new Long(long)

于 2013-08-30T11:51:22.120 回答
1

没有意识到你可以用另一种方式做到这一点的人?

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

valueOf 版本对于安全地转换原始值很有用,如果您在原始类型之间进行一堆转换并且不想(例如)导致问题,则非常方便: (int)longBiggerThanIntCanHandle

(你不会关心做 (long)intValue,但如果你要同时做一堆转换,为了安全起见,最好使用 valueOf 作为约定。)

于 2013-08-30T11:56:58.943 回答