簡體   English   中英

Autoboxing - 這兩條線之間的差異?

[英]Autoboxing - Difference between these two lines?

我想知道這兩者之間的區別:

Integer I = 30;  // is it autoboxing?

Integer I = new Integer(30);  // I know it is autoboxing

它們是有區別的。 第一個將被視為

Integer I = Integer.valueOf(30);  // autoboxing

它將使用已存儲在內部緩存中的Integer對象(當自動裝箱范圍為-127到128(含)時,這是正確的)。 第二個將顯式創建一個新的 Integer對象。

你可以自己看看:

Integer I1 = 30;
Integer I2 = 30;

System.out.println(I1 == I2);
true

VS

Integer I1 = new Integer(30);
Integer I2 = new Integer(30);

System.out.println(I1 == I2);
false

通常不要將Integer對象與==進行比較,因為它會測試引用相等性。 我在這里使用它來測試I1I2引用相同的實例。 在第一個片段中,它們之所以這樣,是因為對應於int 30Integer已經存在於緩存中,並且該實例被使用並分配給I1I2 在第二個片段中,它們沒有,因為我們通過new創建了兩個獨立的對象。

順便說一下,在第二種情況下沒有涉及自動裝箱,你只是創建一個簡單的新對象。 在第一種情況下存在自動裝箱,因為int被隱式轉換為Integer

通過使用javap -c MyClass查看編譯的字節碼,您實際上可以看到自動裝箱的效果。

在你寫的第一行

Integer I = 30;

在第一次看,你給一個對象分配一個整數(沒有顯式類型后綴的所有數字文字被認為是整數),你認為編譯器應該抱怨不兼容的類型。 但它沒有,那么這就是魔術發生的地方 - > auto boxing 編譯器自動將整數30插入到對象I ,即它創建一個包含整數值30的Object並將其分配給您的引用。

在線

Integer I = new Integer(30);

您明確使用new來創建對象。 所以你不要讓編譯器有任何機會做任何事情。 實際上,是什么讓人確定這是auto boxing

除此之外,jvm還會為常量緩存一系列值,以最大限度地減少用於這些常量的內存,從而提高性能。 要使用此功能,您應該使用valueOf()方法獲取此類對象的實例。 在這種情況下,對於相同的整數值,返回一個唯一對象。 如果你使用new創建它,那么對於同一個常量,你每次都會得到一個不同的對象。

暫無
暫無

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

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