2009-11-30 37 views
2

每當我用兩個不同的StringBuffer對象使用equals()方法時,我得到的結果爲false,但是當我使用equals()方法和兩個不同的String對象時,我得到的結果爲true。爲什麼?用相等的方法混淆

String s=new String("434"); 
    String s1=new String("434"); 

    System.out.println(s.equals(s1));//true 

    StringBuffer s=new StringBuffer("434"); 
    StringBuffer s1=new StringBuffer("434"); 

    System.out.println(s.equals(s1));//false 

回答

15

StringBuffer不會覆蓋equals()。因此,Object.equals()被調用,它比較對象標識(內存地址)。字符串會覆蓋equals並比較內容。

+0

OOC,如何* DO *你可以使用默認實現equals的字符串來比較實際的對象嗎? – 2009-11-30 20:30:14

+0

使用'=='運算符來比較對象引用的相等性。 – seh 2009-11-30 20:38:46

+0

StringBuffer.equals()方法沒有實現嗎? – 2009-11-30 22:20:04

1

String s.equals將使用字符串表來比較實際的字符串,因爲StringBuffer sb.equals將只使用equals方法的默認實現並僅比較對象指針。

2

至少在我的JDK版本(Sun 1.6)中,StringBuffer沒有實現equals()方法。這意味着它繼承了Object的equals()方法,它與==

如果你真的想測試兩個StringBuffers是否相等,你可以調用x.toString()。equals(y.toString())

3

StringBuffer不會覆蓋Object#equals(),所以您遇到參考身份爲基礎的檢查,而不是爲基礎的檢查。由於這些StringBuilder實例是不同的,每個實例都有不同的內存位置,因此基礎Object#equals()實現將始終返回false。

這裏的定義,如Java 6:

public boolean equals(Object obj) { 
    return (this == obj); 
} 

看這個問題?

+0

在整個對話中......我只能理解你的答案。 – Hariharbalaji 2009-12-01 05:52:23

2

如果你在找什麼做的是比較兩個StringBuffer的對象的字符串表示,那麼你想要做的是:

StringBuffer sb1 = new StringBuffer("434"); 
StringBuffer sb2 = new StringBuffer("434"); 
if (sb1.toString().equals(sb2.toString())) { 
    // whatever you want to do if they're equal 
} else { 
    // whatever you want to do if they're not 
} 

否則,你要比較兩個StringBuffer的平等對象,而不是它們的內容 - 換句話說,執行Object#equals(),不是(不存在的)StringBuffer#equals()。

+0

請注意,這些對'StringBuffer#toString()'的調用都會創建底層字符數組的全新副本。如果你以後需要訪問任何一個緩衝區作爲'String's,那麼把這個第一次調用的引用保存到'toString()'並重用它們是一種很好的方式。 – seh 2009-11-30 20:36:25

2

等於只有在兩個對象相同時纔在StringBuffer對象上返回true。爲了比較StringBuffers你想要的方式,使用此:

System.out.println(s.toString().equals(s1.toString()); 
0

的StringBuffer沒有它的equals方法自己的FPGA實現因此hashvalues進行比較,而不是比較實際是從Object類繼承了equals()方法stringBuffer中的內容。因此,我們必須將它明確地轉換爲一個字符串對象,它提供了equals()方法的實現。

0

String對象的語義是這樣的,即如果有兩個實例觀察到包含相同的字符序列,它們將總是包含相同的字符序列,並且可以 - 至少從String對象的立場出發本身 - 在不改變程序語義的情況下,將其中一個字符串的所有引用替換爲對另一個字符串的引用。這些實例可能被認爲是等價的,因爲出於所有實際目的,在String的實例中封裝的唯一信息是目標實例中包含的字符序列。

相比之下,StringBuffer類型的變量封裝不只是一個字符序列,也是一個特別實例的身份。如果兩個變量引用同一個實例,則更改爲由一個變量引用的實例將影響另一個引用的實例(因爲它是相同的實例)。如果它們引用不同的實例,則對一個引用的實例所做的更改不會影響另一個引用的實例。不讓Java的StringBuffer覆蓋equals不是懶惰的結果,而是基於這樣的事實:StringBuffer對象具有有意義的身份,並且不相交的實例總是具有不同的身份。