2010-01-06 30 views
20
StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 
System.out.println(sb1 == sb2); 
System.out.println(sb1.equals(sb2)); 

這裏都返回false。這怎麼可能?比較StringBuffer內容與等於

回答

27

equals方法StringBuffer不會從Object覆蓋,所以它只是參考相等,即與使用==相同。我懷疑這樣做的原因是StringBuffer是可修改的,並且覆蓋equals對於您可能想要用作鍵的類似於類的類最爲有用(儘管列表也有重載的equalsStringBuffer也是一種列表,所以這是有點不一致)。

18

您正在比較對StringBuffer對象的引用,而不是StringBuffer中的實際字符串。

System.out.println(sb1.toString().equals(sb2.toString()))會返回true,我認爲這是您的預期或想要實現的。

2

StringBuffer似乎已經沒有自己的equals方法,所以我的第一個猜想是,StringBuffer繼承的Objectequals方法,其中比較了使用sb1 == sb2。因此,這兩種方法都會產生相同的結果。

2

都比較對象的兩個引用(sb1是1,sb2是第二個),因此兩者都不相同。

如果您正在嘗試比較內容 - 使用方法的compareTo(...)字符串類 - 那就是 - 使用方法的toString()首先得到字符串內容StringBuffer的的(.toString()。compareTo)。

Ps。從JDK 5開始,還有另一種速度更快的類,其行爲完全如StringBuffer - 它是StringBuilder ,也是 ,但不是線程安全的。

StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 

System.out.println(sb1.toString().compareTo(sb2.toString())); 
+0

據我所知,StringBuidler不是線程安全的 – Yaneeve 2010-01-06 11:18:06

+0

StringBuilder不是線程安全的。從StringBuilder上的SDK文檔:「與StringBuffer兼容,但**不保證同步**」,從以下的介紹段落開始:http://java.sun.com/j2se/1.5.0/docs/api/ java/lang/StringBuilder.html – 2010-01-06 11:26:17

+0

當然,我的不好。閱讀StringBuffer的文檔太快,IT由StringBuilder填充,因此它意味着供單個線程使用。對不起。 – mkolodziejski 2010-01-06 11:32:05

4

簡單的答案是StringBuffer(和StringBuilder)不重新定義Object.equals()的基本語義。因此,StringBuffer上的equals將簡單地比較對象引用。

事實上,字符串的StringBuffer,StringBuilder的和CharBuffer中都實現了CharSequence接口,並且該接口的Javadoc這樣說:

此接口不修改的equals和hashCode方法的一般合同。因此,比較實現CharSequence的兩個對象的結果通常是未定義的。每個對象都可以由不同的類來實現,並且不能保證每個類都能夠測試其實例與其他實例的相等性。因此,將任意CharSequence實例用作集中的元素或映射中的鍵是不合適的。

0

想知道爲什麼StringBuffer不覆蓋equals方法。可能是因爲該對象的內容通過toString()方法獲得,並且具有所需的方法。

5
1. System.out.println(sb1 == sb2); 

僅當StringBuffer對象與自身比較時,StringBuffer的equals方法才返回true。與任何其他StringBuffer相比,即使兩者包含相同的字符,它也會返回false。

這是因爲「==」檢查引用平等,因爲這兩個SB1和SB2是不同的對象引用,所以如果你想檢查的內容是在這種情況下,輸出是「假的」

仍等於在這兩個StringBuffer的對象,你可以使用這個:

sb1.toString().equals(sb2.toString()) 

2. System.out.println(sb1.equals(sb2)); 

這是給「假」輸出,因爲.equals()方法尚未在StringBuffer類覆蓋。所以它使用父級「Object」類中的.equals()方法。在對象類中已經寫入了.equals()以檢查引用的相等性。

請注意,在String的情況下,sb3.equals(sb4)將返回「true」。因爲.equals()方法已在String類中被覆蓋,以檢查和匹配兩個不同的字符串的內容。

0

Stringbuffer的equals()未被覆蓋。它不會比較值,它只會比較參考值分配。這就是爲什麼你會因爲他們都指向不同的對象而變得虛假。