在討論區中看到這樣一個問題:
java
public static void main(String[] args) { Integer i = 200; Integer j = 200; System.out.println(i == j); //false System.out.println(200 == i); //true }
原問題連接:http://www.oschina.net/question/727875_148095.net
第一個輸出的結果爲false,而第二個輸出的結果爲true。code
注意 i 和 j 都不是基本的數據類型,而是類Integer的對象,這其中便涉及到java的自動裝箱和拆箱的機制。htm
JDK 5.0以前都是手動進行包裝類的裝箱和拆箱,以下:對象
int i = 1;//基本數據類型int Integer j = new Integer(i);//手動裝箱 int k = j.intValue();//手動拆箱
5.0以後能夠自動進行裝箱和拆箱的操做,以下:blog
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。get
在java中,每種基本數據類型都有對應的包裝類,以下:it
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 |