最近我偶然发现了人们写
之类的代码Long myLong = Long.valueOf(42);
// instead of
Long myLong = 42L;
我不知道为什么会这样做,除了有关可读性的个人品味。
我错过了什么吗?
答案 0 :(得分:16)
直接分配如果将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
方法通常会缓存一系列值(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
更好,但如果你有int
或long
变量,Long.valueOf
是获得Long
的好方法}。 valueOf
还使用-128到127之间的值缓存,这使得它在new Long(long)
上的公共值略有性能优势。
答案 5 :(得分:1)
没有意识到你可以通过其他方式做到的人?
我不得不怀疑编译器是否足够聪明,可以将Long.valueOf转换为相同的字节码,以进行常量调用。否则会有很小的性能损失(不显着,但你可能会注意到它运行严重,紧密的循环)。
valueOf版本对于安全地转换原始值非常有用,如果你在原始类型之间进行一系列强制转换并且不希望(例如)导致问题: (INT)longBiggerThanIntCanHandle
(你不会关心做(长)intValue,但是如果你两种方式都做了很多转换,为了安全起见,最好使用valueOf作为约定。)