在搜索StackOverflow或Google时,我找不到任何有关此内容的信息,而且我有一些同事不同意我对如何初始化简单Long
变量的偏好。
有没有理由使用其中一种格式而不是另一种格式?
Long foo = (long) 0; // First way of doing it
Long bar = 0L; // Second way of doing it
如果有人知道这里是否存在效率差异,我最感兴趣。
我更喜欢第二种方式的原因是因为你可以指定小于Integer.MIN_VALUE
且大于Integer.MAX_VALUE
的值,而Eclipse会抱怨“类型int的文字10000000000是”超出范围“如果你在这里使用第一种方式。
答案 0 :(得分:10)
没有区别(除了你提到的)。编译器非常聪明。如果我编译以下类:
public class Test {
public static void main(String[] args) {
Long foo = (long) 0;
Long bar = 0L;
}
}
然后反编译:
$ javap -c Test.class
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: lconst_0
1: invokestatic #2 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
4: astore_1
5: lconst_0
6: invokestatic #2 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
9: astore_2
10: return
}
我没有看到任何区别。 使用一个看起来更适合您或符合惯例。
要验证反编译器,我将这两行独立编译,然后计算校验和:
$ sha1sum Test.class_L Test.class_long
292a93b6433b5a451afdb41bd957667c91eebf23 Test.class_L
292a93b6433b5a451afdb41bd957667c91eebf23 Test.class_long
答案 1 :(得分:9)
Long foo = (long) 0; // First way of doing it
这种方式会创建int
,然后将投射到long
。
Long bar = 0L; // Second way of doing it
这是long
字面值,因此它只会创建long
。
我认为差异可以忽略不计,但创建long
比创建int
然后转换为long
更快。
修改强>
正如您所说,第一种方式只允许您将int
转换为long
,这意味着在一行中,您只能创建一个long
int
的大小......这是毫无意义的,浪费了记忆。
答案 2 :(得分:2)
(long) 0
将int
投射到long
。 0L
是long
。因此,如果您想使用long
,请使用一个。
答案 3 :(得分:0)
没有提到的一个区别是编译器将拒绝大于2147483647但没有L
后缀的数字文字。如果存在语义原因,为什么需要将文字处理为类型long
而不是int
,但如果给定任何大于2147483647的值,则代码会出现故障,那么转换未填充的文字会保留约束强制将类型处理为long
时的值。这样的事情可能是合适的,例如,如果一个值乘以256然后再除以256,并且如果这种除法的结果需要适合int
。