最近我偶然发现了人们写的代码,比如
Long myLong = Long.valueOf(42);
// instead of
Long myLong = 42L;
我不知道为什么要这样做,除了关于可读性的个人品味。
我错过了什么吗?
最近我偶然发现了人们写的代码,比如
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)
如果不是绝对必要,则应避免使用,并且需要使用上述语句之一来支持这一点,因为方法通常会在 JVM 内部valueOf
缓存一系列值( )FlyWeight Design Pattern
琐事:在整数和 Oracle JVM 的情况下,可以使用来控制范围-XX:AutoBoxCacheMax=
片段
Long myLong = 42L;
内部相同
Long myLong = Long.valueOf(42);
编译器将生成相同的字节码。
我也觉得是对java5之前的java的提醒,没有自动装箱,在哪里
Long l = 42L;
无法编译。
它们是等价的,编译器将为两者构建相同的字节码
valueOf
需要一个原始long
. 对于文字,我同意这42L
更好,但如果你有一个int
orlong
变量,Long.valueOf
这是获得Long
. valueOf
还使用从 -128 到 127 的值的缓存,这使得它在常见值方面具有轻微的性能优势new Long(long)
。
没有意识到你可以用另一种方式做到这一点的人?
我不得不怀疑编译器是否足够聪明,可以将 Long.valueOf 转换为相同的字节码,以进行常量调用。否则会对性能造成很小的影响(不显着,但您可能会注意到它运行繁重、循环紧密)。
valueOf 版本对于安全地转换原始值很有用,如果您在原始类型之间进行一堆转换并且不想(例如)导致问题,则非常方便: (int)longBiggerThanIntCanHandle
(你不会关心做 (long)intValue,但如果你要同时做一堆转换,为了安全起见,最好使用 valueOf 作为约定。)