Java - 有没有理由使用这种格式:(长)0;而不是这一个:0L;?

时间:2014-03-12 14:36:03

标签: java

在搜索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是”超出范围“如果你在这里使用第一种方式。

4 个答案:

答案 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) 0int投射到long0L long。因此,如果您想使用long,请使用一个。

答案 3 :(得分:0)

没有提到的一个区别是编译器将拒绝大于2147483647但没有L后缀的数字文字。如果存在语义原因,为什么需要将文字处理为类型long而不是int,但如果给定任何大于2147483647的值,则代码会出现故障,那么转换未填充的文字会保留约束强制将类型处理为long时的值。这样的事情可能是合适的,例如,如果一个值乘以256然后再除以256,并且如果这种除法的结果需要适合int