在讨論區中看到這樣一個問題:
public static void main(String[] args) {
Integer i = 200;
Integer j = 200;
System.out.println(i == j); //false
System.out.println(200 == i); //true
}
第一個輸出的結果為false,而第二個輸出的結果為true。
注意 i 和 j 都不是基本的資料類型,而是類Integer的對象,這其中便涉及到java的自動裝箱和拆箱的機制。
JDK 5.0之前都是手動進行包裝類的裝箱和拆箱,如下:
int i = 1;//基本資料類型int
Integer j = new Integer(i);//手動裝箱
int k = j.intValue();//手動拆箱
5.0之後可以自動進行裝箱和拆箱的操作,如下:
Integer i = 1;//自動裝箱
int j = i;//自動拆箱
Integer i = 10;
System.out.println(i--);//10,計算時的自動拆箱
Integer a = 95;
Integer b = 95;
System.out.println("a==b:" + (a==b));//a==b:true
但是,如下程式輸出的結果并不是一樣的:
Integer a = 295;
Integer b = 295;
System.out.println("a==b:" + (a==b));//a==b:false
這是因為在自動裝箱的時候,-128到127的值被裝箱成Integer對象存在記憶體中是可以被重用的,是以第一個比較結果會輸出true,而超出以上範圍的數值裝箱後的對象并不會被重用,那麼就相當于new兩個Integer對象,比較的結果自然是false。
在java中,每種基本資料類型都有對應的包裝類,如下:
INDEX
基本資料類型
包裝類
1
int
Integer
2
char
Character
3
float
Float
4
double
Double
5
byte
Byte
6
short
Short
7
long
Long
8
boolean
Boolean