2013-04-08 91 views
1

這是一個非常基本的問題,我想,但我不知道如何已瞭解下列因此,如果有人會這麼好心發生什麼如何原始值存儲在對象,當對象被投

Object a = 128; 
Object b = 128; 
Log.debug("a: " + ((Integer) a == (Integer)b)); 
Log.debug("b: " + (((Integer) a).intValue() == ((Integer) b).intValue())); 

「一「是假的,而」b「是真的,兩者對於a = 127和b = 127都是正確的。

+0

請記住,當你真的想要使用'equals()'時,不要使用'==' – Shark 2013-04-08 13:59:08

回答

5

當你比較對象引用,==是當引用參考同一個對象,並不等同對象定義爲true。 (這就是equals的用途。)

對於基元,==定義爲true等效值。

在第一個示例中,您有兩個不同的對象,一個分配給a,另一個分配給b。這是因爲您要分配給引用類型的原語是「autoboxed」(自動包裝在原語的等效對象類型中)。您的代碼:

Object a = 128; 
Object b = 128; 

...是有效的治療是這樣的:

Object a = Integer.valueOf(128); 
Object b = Integer.valueOf(128); 

...其中Integer.valueOf返回Integer對象包裝你給它的價值,這可能會或可能不會是相同的對象用於具有相同值的後續調用,具體取決於您給予的值。根據JavaDoc:

如果不需要新的Integer例如,這種方法一般應優先使用構造Integer(int),因爲此方法可能通過緩存經常請求的值,以產生顯著更好的空間和時間性能。此方法將始終緩存-128至127(含)範圍內的值,並可緩存此範圍之外的其他值。

因此,這意味着,當你與價值127跑了,你得爲每個調用同一對象Integer.valueOf,所以==工作。但是對於128,每個調用都會得到不同的對象,因此==不起作用,因爲它再次檢查兩個引用是指相同對象,而不是等價對象。

+1

我沒有聽到一會兒提到的自動裝箱,好的;) – Shark 2013-04-08 14:01:32

+1

這並不能解釋爲什麼這個例子適用於127而不是128.當你假設語句被翻譯成「Object a = Integer.valueOf(128)」並且窺視了valueOf()的javadoc:「返回一個表示指定int值的Integer實例時, ..],因爲此方法通過緩存經常請求的值可能會產生顯着更好的空間和時間性能。此方法將始終緩存範圍在-128至127之間的值,並且可能會緩存該範圍之外的其他值。 – 2013-04-08 14:25:18

+0

@GyroGearless:謝謝你。我錯過了OP說它適用於127,並且不知道關於'Integer.valueOf'的緩存。 – 2013-04-08 14:28:14

7
Object a = 128 

被編譯成

Object a = Integer.valueOf(128) 

這就是所謂的自動裝箱。

在一些JDK版本中,Integer.valueOf()使用通常從-128到127的Integer實例緩存,並且從此緩存返回實例,而不是每次都創建一個新的Integer實例。這就是爲什麼==爲127而不是爲128返回true。

不要依賴這個,因爲它是一個非強制的實現細節。始終比較它們的基本int值或使用equals()

1

Integer.intValue()將其轉換目的是原始數據類型爲INT

的「==」是檢查項目

的euqality如果我們與對象檢查如函數(整數)一個==(整數)b,則它檢查該整數值的

refrences因爲你從原始數據類型

和((整數)一).intValue()==((整數)類型強制轉換它作爲對象b).intValue())

它檢查實際值不參考(存儲這些值的地址位置

如果要檢查實際值,請使用equals()方法比較它們的值。