2013-10-19 145 views
2
class Demo{ 
public static void main(String[] args) { 
    Integer i = Integer.valueOf(127); 
    Integer j = Integer.valueOf(127);   

    System.out.println(i==j); 

    Integer k = Integer.valueOf(128); 
    Integer l = Integer.valueOf(128);   

    System.out.println(k==l); 
    } 
} 

第一個打印語句打印爲真,而第二個打印語句打印爲false。爲什麼? 請詳細解釋。關於整數比較的澄清?

+1

這已經在這裏討論: http://stackoverflow.com/questions/3130311/weird-integer-boxing-in-java 這裏: http://stackoverflow.com/questions/1514910/when-comparing-two-integers-in-java-does-auto-unboxing-occur –

回答

5

這是因爲Integer緩存。

java language specification 5.1.7

If the value p being boxed is true, false, a byte, or a char in the range 
\u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), 
then let r1 and r2 be the results of any two boxing conversions of p. 
It is always the case that r1 == r2. 

理想情況下,拳擊給定的原始值p,將總是產生相同的參考

Integer i = Integer.valueOf(127); 
Integer j = Integer.valueOf(127); 

i都和j指向相同的對象。隨着該值小於127

Integer k = Integer.valueOf(128); 
Integer l = Integer.valueOf(128); 

兩個k & l指向不同的對象。由於該值大於127.
由於您正在使用==運算符檢查對象引用,因此會得到不同的結果。


更新

您可以使用equals()方法來得到相同的結果

System.out.println(i.equals(j));//equals() compares the values of objects not references 
System.out.println(k.equals(l));//equals() compares the values of objects not references 

輸出是

true 
true 
  1. ==操作員檢查實際的對象引用。
  2. equals()檢查對象的值(內容)。

回答評論

你,

Integer i = Integer.valueOf(127); 

這裏創建新對象&參考分配給i

Integer j = Integer.valueOf(127); //will not create new object as it already exists 

由於整數高速緩存(數字在-128到127之間),以前創建的對象引用被分配給j,則ij指向相同的對象。

現在考慮,

Integer p = Integer.valueOf(127); //create new object 
Integer q = Integer.valueOf(126); //this also creates new object as it does not exists 

顯然使用==運營商和equals()方法兩張支票將導致false。由於兩者都是不同的參考,並有不同的價值。

+0

可以請你詳細說明「我和j指向相同的參考「和」k和l指向不同的參考「 –

+0

@PrasoonMishra:請參閱更新的帖子。我希望你的疑問能夠明確。閱讀更新後的帖子有任何疑問讓我知道。謝謝。 –

4
i==j 

true爲由於整數緩存-128127之間的值。

language spec

如果被裝箱值p爲真,假,字節,或在範圍\ u0000的一個char到\ u007f,或-128和127之間int或短號碼(包括),那麼讓r1和r2是p的任何兩個裝箱轉換的結果。 r1 == r2總是如此。

Integer i = Integer.valueOf(127); // new object 
    Integer j = Integer.valueOf(127); //cached object reference 
    Integer k = Integer.valueOf(128); // new object 
    Integer l = Integer.valueOf(128); // new object 

所以ij都指向,因爲價值相同的127

凡爲kl指向差異的引用,因爲它們的價值>127

是有原因的在文檔中提到此行爲:

這種行爲將是理想的行爲,不會對性能造成不必要的損失,特別是在小型設備上。內存有限的實現可能會更少

0

valueOf返回整數對象。 Integer是int的包裝類。對於你的情況,

Integer == Integer比較實際的對象引用,其中int == int將比較值。

如前所述,值-128到127被緩存,所以返回相同的對象。

如果在該範圍之外,將創建單獨的對象,以便引用不同。

您可以通過以下方式解決它,如果你想爲你的這兩種情況下相同的結果:

  • 充分利用類型int
  • 鑄類型爲int或
  • 使用.equals()