最近,我偶然发现了人们编写类似代码的代码

Long myLong = Long.valueOf(42);

// instead of

Long myLong = 42L;

除了对可读性的个人喜好外,我不知道为什么要这么做。

我想念什么吗?

最佳答案

如果您直接将int分配给Long,则需要强制转换(将int分配给原始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方法通常由JVM内部缓存一定范围的值(FlyWeight Design Pattern)

Trivia:对于整数和Oracle JVM,可以使用-XX:AutoBoxCacheMax=来控制范围

09-10 10:05
查看更多