2014-09-28 43 views
6

請你能解釋下面的行爲。在JDK 6在java等於==的行爲

true 
true 
true 
false 

public class EqAndRef { 

    public static void main(String[] args) { 
     Integer i = 10; 
     Integer j = 10; 

     Double a = 10D; 
     Double b = 10D; 

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


     System.out.println(a.equals(b)); 
     System.out.println(a == b); 


    } 
} 

輸出爲什麼== b爲假,我==Ĵ不是假的?

+1

這是參考,而不是平等的價值相等,用'Integer'不斷爲實習生(ED)。你應該總是喜歡'.equals()'和'Object'類型。 – 2014-09-28 02:28:04

+2

請參閱[是否可以使用==比較Java中的不可變對象](http://stackoverflow.com/questions/10970823/is-it-ok-to-compare-immutable-objects-in-java-使用而不是等於) – Volune 2014-09-28 02:29:00

+0

@Volune,示例中的Double對象是不可變的。 – 2014-09-28 02:32:30

回答

2

初始化Integer S中的下列方式,那麼你將得到的差額作爲@ 5gon12eder說

的整數Si和j是整數文字構造(通過自動裝箱)的範圍是從-128到127,是保證由JVM彙集,因此它們使用相同的對象(請參閱flyweight模式)。因此,他們通過對象引用比較相等。

試試這個代碼用'Double`它並沒有初始化整數

Integer i = new Integer(10); 
    Integer j = new Integer(10); 
19

Integer小號ij從整數常量從範圍是從-128到127構成(通過自動拳擊),因此,保證由JVM被彙集,從而對同一對象(見flyweight pattern)用於它們。因此,它們通過對象引用來比較相同。

另一方面,對於Doubleab,不存在這樣的池保證,在你的情況下,你有兩個不相同的對象。

如果您不打算檢查身份,則使用==比較對象將被視爲可疑,應該避免。兩種類型的equals方法都被覆蓋以比較盒裝值(與對象標識相反),這就是爲什麼它們在兩種情況下都返回true(並且應該使用)。