最近,我偶然发现了人们编写类似代码的代码
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=
来控制范围