[英]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
對象與==
進行比較,因為它會測試引用相等性。 我在這里使用它來測試I1
和I2
引用相同的實例。 在第一個片段中,它們之所以這樣,是因為對應於int
30
的Integer
已經存在於緩存中,並且該實例被使用並分配給I1
和I2
。 在第二個片段中,它們沒有,因為我們通過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.