2009-10-18 18 views

回答

2

對於引用類型,==會比較實際引用(在對象所在的內存中的位置),其中equals方法執行數據比較。

出於性能方面的原因,JVM有時會爲您的不可變字符串「實習」字符串。導致此:在參考對象的情況下

String a = "abc"; 
String b = "abc"; 
if (a == b){ 
    //The if statement will evaluate to true, 
    //if your JVM string interns a and b, 
    //otherwise, it evaluates to false. 
} 

http://en.wikipedia.org/wiki/String_interning

+0

學會了一個新概念 - 實習! – lft93ryt 2017-03-27 04:00:18

1

的「==」操作符對你有基本類型,即引用本身。即a == b將比較原始類型的值爲int,但會比較引用類型的引用(而非值)。當調用equals()方法時,兩個不相同但具有相同值的引用類型對象將返回true,但a == b將爲false。

對於原始類型,調用方法時,類型先前被轉換(裝箱)爲引用類型,然後調用該方法。這意味着對於基本類型a == b將產生與a.equals(b)相同的值,但在後一種情況下,會在調用equals()方法之前創建兩個臨時盒裝對象。這會使操作在CPU時間上更加昂貴,這可能會或可能不會成爲問題,具體取決於它發生的位置。

也就是說,要比較原始類型值,您應該使用==,而要比較參考類型值,您應該使用.equals()方法。

toString()方法相同。當調用引用類型的對象時,它會調用適當的方法併產生一個String。在基元類型上調用時,該類型將被自動裝箱,然後該方法將在臨時對象中調用。在這種情況下,您可以調用適當的toString()靜態方法(即對於int調用Integer.toString(myint)),這將避免創建臨時對象。

+0

如果'a'是一個基本類型'a.equals(b)'不會編譯。 – ajb 2013-10-31 00:24:53

7

對於常規類型(包括字符串):

  • ==比較對象的引用。它測試兩個對象引用是否相等;即它們是否指代相同的對象。
  • equals(Object)測試此對象是否「等於」另一個。 「等於」的含義取決於對象的類如何定義平等。 java.lang.Object類定義equals(other)this == other,但許多類覆蓋此定義。
  • toString()提供了對象到字符串的簡單轉換。結果字符串的格式和內容是特定於類的,並且(從合同的角度來看)並不保證它是有意義的。

對於(真)原語類型:

  • ==比較類型的值,和
  • equals()toString()沒有定義。 Java不允許你調用原始值的方法。

然而,這是複雜的,因爲在某些情況下 Java語言說,一個基本類型可以「autoboxed」所帶來的基本類型的相應的包裝類型的實例;例如int對應於java.lang.Integer等等。對於包裝類:

  • ==被定義一樣的任何其他引用類型,
  • equals()比較包裹值,並且
  • toString()格式化包裹值。

    int a = ... 
    int b = a; 
    Integer aa = a;  // autoboxing occurs 
    Integer bb = b;  // autoboxing occurs 
    
    assert a == b;   // always succeeds 
    assert aa.equals(bb); // always succeeds 
    assert aa == bb;  // sometimes succeeds, sometimes fails. 
    

    的原因,過去有時會失敗,就是JLS不保證自動裝箱給定的原始值將始終給予同樣的包裝:

在作品中的扳手通過以下所示目的。它會在某些情況下(例如對於小整數),而不會對其他人(例如大整數)。

從上面的例子中可以學到的教訓是,在參考類型上使用==時需要非常小心。只有當你使用想要測試兩個引用是否屬於同一個對象。不要使用它,如果你只是想測試對象是否「相等」而沒有調用equals()的開銷。

(另請注意,String是另一種類型,其中==是想給你錯誤的答案在許多情況下,見How do I compare strings in Java?)。

+0

基元上的'=='只檢查值並忽略這些類型。 'int x = 5;長y = 5L;字節b = 5; x == y; b == x;'兩者都返回true。 – arun 2014-03-21 14:06:12

+1

它不是「忽略」的類型。其中一個或其他操作數正被提升爲另一個操作數的類型。此外,我說「類型的值」... – 2014-03-21 14:23:53

相關問題