2011-11-22 61 views
5

我最好的代碼片段:Integer類對象

public class Test{ 
    public static void main(String args[]){ 
     Integer a = 100; 
     Integer b = 100; 
     Integer c = 5000; 
     Integer d = 5000; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     System.out.println(d); 
     if(a == b) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c == d) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

我沒有得到爲什麼輸出是這樣的嗎? 的Output是:
a & b Both are equal
c & d are not equal
我使用jdk1.7

+1

**當equals()爲真時,對象**只有「相等」。使用'=='表示**引用**是相同的。 –

回答

7

這是由於小(常用)的整數映射到對象池被重複使用虛擬機的優化。 This answer解釋了一些細節。

4

它看起來像java編譯器使用Integer對象的緩存值。該緩存僅填充小的inetger值。 100的值在緩存中,因此該對象被重新使用。 5000的值不在cahce中,因此每次創建新對象。

==比較測試的對象相等,而不是值相等,因此爲什麼緩存的對象被認爲是相等的,其他人不是。

+0

你的陳述能證明嗎? –

+0

請更精確?哪些陳述需要證明? –

+0

你自己的代碼就是證明。 –

2

你比較地址使用==運營商和編譯器必須簡單地重複使用相同的變量ab對象,但不是cd對象Integer對象。如果使用equals方法測試相等,則得到理想的效果:

public class Test{ 
    public static void main(String args[]){ 
     Integer a = 100; 
     Integer b = 100; 
     Integer c = 5000; 
     Integer d = 5000; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     System.out.println(d); 
     if(a.equals(b)) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c.equals(d)) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

100 
100 
5000 
5000 
a & b Both are Equal 
c & d Both are Equal 
0

拳擊轉換 拳擊轉換是轉換原始類型的值,以對應的參考類型的值。具體而言,下列8的轉換被稱爲裝箱轉換:

從布爾類型爲類型布爾 從類型字節輸入字節 從類型char鍵入字符 從類型短鍵入短 從int類型爲類型整數 從型長鍵入龍 從類型浮子式浮球 從型雙輸入雙 在運行時,裝箱轉換如下進行:

如果p是布爾類型的值,然後裝箱轉換轉換p到類的參考r中,並輸入Boolean,例如r.bo oleanValue()== p 如果p是字節類型的值,那麼裝箱轉換將p轉換爲類的類型爲Byte的引用r,使得r.byteValue()== p 如果p是char類型的值,然後裝箱轉換將p轉換爲類和字符的引用r,如r.charValue()== p 如果p是short類型的值,則裝箱轉換將p轉換爲類的引用r,並輸入Short ,如r.shortValue()== p 如果p是一個int類型的值,那麼裝箱轉換將p轉換爲類的一個引用r並且類型爲Integer,例如r.intValue()== p 如果p是long類型的值,然後裝箱轉換將p轉換爲類型和類型Long的引用r,使得r.longValue()== p 如果p是float類型的值,則: 如果p不是NaN,則拳擊轉換ersion將p轉換爲類的類型和類型Float的引用r,這樣r.floatValue()的計算結果爲p 否則,裝箱轉換會將p轉換爲類的引用r,然後鍵入Float,使r.isNaN()的值爲true。 如果p是double類型的值,則 如果p不是NaN,則裝箱轉換會將p轉換爲類的參考r並輸入Double,以便r.doubleValue()的計算結果爲p 否則,裝箱轉換會將p轉換爲類和類型Double的引用r,使得r.isNaN()的計算結果爲true。 如果p是任何其他類型的值,則裝箱轉換等同於身份轉換(5.1.1)。 如果正在裝箱的值爲真,假,一個字節,範圍在\ u0000到\ u00f之間的一個字符,或者在-128到127之間的一個int或短數字,則讓r1和r2是任意兩個裝箱的結果轉換。它始終是這種情況r1 == r2 好閱讀 - http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7

相關問題