簡體   English   中英

Long a = Long.valueOf(1)或Long a = 1L之間有什么區別嗎?

[英]Is there any difference between Long a = Long.valueOf(1) or Long a = 1L?

只是想知道這個和其他相關函數是否是那些不應該被打擾的東西之一,只需要使用Long a = 1L ; 簡單明了。

它們本質上是相同的,編譯器在內部創建對Long.valueOf()的調用,當它必須將基元long轉換為Long時,這稱為“裝箱”。

在普通代碼中,您應該使用long的原始類型,它比Long更有效。 只有在需要對象時才需要Long,例如將long值放入集合中。

讓我們看看幕后發生了什么。 首先,考慮一下:

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

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

}

好的,現在將程序更改為以下內容:

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

再次編譯和反匯編。

你會看到這個版本的程序編譯成與第一個版本完全相同; 編譯器自動生成對Long.valueOf(...)的調用。

請參閱: Autoboxing

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM