Long a = Long.valueOf(1)或Long a = 1L之间有什么区别吗?

non*_*tor 6 java

只是想知道这个和其他相关的函数是否是那些不应该被打扰的东西之一,只是去了Long a = 1L; 简单明了.

sta*_*lue 10

它们本质上是相同的,编译器在内部创建对Long.valueOf()的调用,当它必须将基元long转换为Long时,这称为"装箱".

在普通代码中,您应该使用long的原始类型,它比Long更有效.只有在需要对象时才需要Long,例如将long值放入集合中.


Jes*_*per 9

让我们看看幕后发生了什么.首先,考虑一下:

public class Example {
    public static void main(String[] args) {
        Long a = Long.valueOf(1L);
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

用这个编译javac Example.java.然后拆开它javap -c Example.结果如下:

Compiled from "Example.java"
public class Example extends java.lang.Object{
public Example();
  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_1
   1:   invokestatic    #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
   4:   astore_1
   5:   getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   8:   aload_1
   9:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   12:  return

}
Run Code Online (Sandbox Code Playgroud)

好的,现在将程序更改为以下内容:

public class Example {
    public static void main(String[] args) {
        Long a = 1L;
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

再次编译和反汇编.

你会看到这个版本的程序编译成与第一个版本完全相同; 编译器已Long.valueOf(...)自动生成调用.

请参阅:Autoboxing