一、java基本資料型別及其封裝類別
java資料型別有基本資料型別和參考資料型別,為了方便將基本資料型別當作物件處理,java引入了基本資料型別相對應的封裝類,如int封裝類是Integer。
線上教學影片分享:java教學影片
二、java自動拆箱和自動裝箱
1、自動裝箱
自動裝箱其實就是將基本資料型別轉換成參考資料型別(物件)
2、自動拆箱
自動拆箱其實就是將引用資料型別轉換為基本資料型別
程式碼如下:
public static void main(String[] args) { Integer a = 1;//这里就用到了自动装箱;等同于Integer a = new Integer(1); int b = a - 1;//对象不能直接进行计算,所以这里有自动拆箱的操作,将a对象转换成基本数据类型,然后-1 System.out.println(a); System.out.println(b); }
列印結果:
1 0
三、 int和Interger的差別
從上面我們就能看出int和Interger的差別:
int是基本資料型,Integer是引用資料型別;
int預設值是0,Integer預設值是null;
int型別直接儲存數值,Integer需要實例化對象,指向對象的位址。
說到這,是不是認為就這麼完事了,其實它們之間還有一些細節方面的區別:如下
public static void main(String[] args) { Integer a = new Integer(1); Integer b = new Integer(1); int c = 1; int d = 1; Integer e = 1; Integer f = 1; Integer g = 130; Integer h = 130; Integer i = new Integer(130); int j = 130; }
1:a == b 嗎?廢話,肯定不相等。兩個new出來的物件位址不一樣。
2:c == d 嗎?這個也是廢話,都是基本資料型別的值肯定相等。
3:現在的關鍵問題是 e == f 嗎? g == h 嗎?
答案是:e == f; g != h。
為什麼會出現這種情況?因為ava在進行編譯時 Integer g = 130會被編譯成 Integer.valueOf(130) ,這個可以透過反編譯class檔案看到。而透過Integer原始碼可以得出,Integer.valueOf() 方法會在數值-128~127之間會對Integer進行緩存,不會再重新new一個,所以e==f ;當數值二大於127或小於- 128的時候則會重新new一個,所以g != h 。
Integer的valueOf方法如下:
public static Integer valueOf(int i) { //IntegerCache.low == -128 ;IntegerCache.high == 127 //当数值大于-128小于127时,进行缓存;否则重新new一个。 if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
4:c == e 嗎, i == j 嗎?
答案都是相等的。因為封裝類別和基本資料型別進行比較的時候,java會自動拆箱,然後比較數值是否相等。
總結:
1、都是封裝類,都是new出來的,一定不相等。因為物件的記憶體位址不一樣。
2、都是封裝類,都不是new出來的,如果值在-128~127之間,那就相等,否則不相等。
3、如果是封裝類別和基本型別比較,只要數值相等那就相等,否則就不相等。因為封裝類別和基本資料型別進行比較的時候會有一個自動拆箱操作。
4、都是基本資料型,如果數值相等,那就相等;否則不相等。
想了解更多相關教學請造訪:java入門
#以上是java中int與integer的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!