2012-12-27 52 views
1

可能重複:
Using == operator in Java to compare wrapper objects原始包裝比較

Java版本1.6.0_26

從一本書爲SCJP考試準備:

爲了節省內存,下面兩個[從-128和127開始的短整型以及其他一些對於問題無關緊要的]包裝對象(通過boixng創建)將始終爲==,值是相同的。

我所做的:

如果我們將從-128比較兩個整數127這樣的:

1. Integer i1 = 10; 
2. Integer i2 = 10; 
3. System.out.println(i1 == i2); // true 

但爲什麼同樣給了我們「假」,也可以是不同樣的事情:

4. Integer i3 = new Integer(10); 
5. Integer i4 = new Integer(10); 
6. System.out.println(i3 == i4); // false 

我的問題:

1)在第一行代碼中,我們做了隱式裝箱嗎?

2)爲什麼第3行和第6行代碼給了我們不同的結果?

+0

你'對了!這是重複的。 – user485553

回答

7

在第一行我們做隱式裝箱的代碼?

Yes 

2)爲什麼第3行和第6行代碼給了我們不同的結果?

Integer.valueOf(int)池的所有值從-128到127

的原因是,小的整數值經常使用並且在創造所有這些值的新對象是沒有意義的,每次我們需要一個對象。因此,它們被創建爲「實體」對象,並且對這樣的整數值的所有引用將指向相同的存儲器地址。從Integer.java

代碼片段:

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 

相反,當你調用new Integer(10);,它正在一個全新的對象,因此兩次與相同的整數值不同的對象會指向不同的存儲器地址

+0

所以,如果我寫Integer i1 = 10;編譯器用Integer隱式取代它i1 = Integer.valueOf(10);這意味着如果我的數字範圍從-128到127(或您的IntegerCache.high),它給了我已經存在的Integer對象。這是我們在==比較中得到真實的主要原因。 – user485553

1

在第一個示例中,編譯器正在使用裝箱來分配變量。在這種情況下,i1/i2是常量(有點像靜態最終對象)。

在第二個示例中,您創建了Integer的兩個實例,因此它們從不相同。

2
1) Does on the 1st line of code we make implicit boxing? 

是。其所謂的Auto-Boxing

2) Why the 3rd and 6th lines of code give us different results? 

的==其實檢查兩個變量是否正好具有相同的值。請注意,一個基本變量包含您所看到的內容,但引用變量包含它所持有對象的地址。

當==用於比較一個基元到一個包裝器時,包裝器將被解包並且比較對於基元是原始的,因此它總是爲真,因爲它是原始比較而不是對象比較。所以這就是爲什麼

System.out.println(i1 == i2); 

會是真的。

但在第6行

System.out.println(i3 == i4); 

你比較兩個對象,除非對象有它不會是真實的相同的參考。如果你使用。等於你可以變成真的方法。嘗試

System.out.println(i3.equals(i4)); 
0

的6行顯示,因爲它比較,看看是否引用i3i4都指向同一個對象假的!在這種情況下,它不是。因此false

如果同時包含包裝和基本體,自動裝箱和取消裝箱將進入畫面。這裏既有i3i4是包裝對象,因此,它將被視爲任何其它POJO

自動裝箱只發生,如果有兩個包裝對象和一個圖元參與,

例如

int primitive = 10; 
Integer wrapper = new Integer(10); 
System.out.println(primitive == wrapper); //true 

打印True在上面的==比較原語的值與包裝的狀態進行比較。

+0

我知道它比較兩個參考。但我不明白它爲什麼這樣做? – user485553