StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));
這裏都返回false。這怎麼可能?比較StringBuffer內容與等於
StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));
這裏都返回false。這怎麼可能?比較StringBuffer內容與等於
equals
方法StringBuffer
不會從Object
覆蓋,所以它只是參考相等,即與使用==
相同。我懷疑這樣做的原因是StringBuffer
是可修改的,並且覆蓋equals
對於您可能想要用作鍵的類似於類的類最爲有用(儘管列表也有重載的equals
和StringBuffer
也是一種列表,所以這是有點不一致)。
您正在比較對StringBuffer對象的引用,而不是StringBuffer中的實際字符串。
System.out.println(sb1.toString().equals(sb2.toString()))
會返回true,我認爲這是您的預期或想要實現的。
StringBuffer
似乎已經沒有自己的equals
方法,所以我的第一個猜想是,StringBuffer
繼承的Object
的equals
方法,其中比較了使用sb1 == sb2
。因此,這兩種方法都會產生相同的結果。
都比較對象的兩個引用(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()));
簡單的答案是StringBuffer(和StringBuilder)不重新定義Object.equals()的基本語義。因此,StringBuffer上的equals
將簡單地比較對象引用。
事實上,字符串的StringBuffer,StringBuilder的和CharBuffer中都實現了CharSequence接口,並且該接口的Javadoc這樣說:
此接口不修改的equals和hashCode方法的一般合同。因此,比較實現CharSequence的兩個對象的結果通常是未定義的。每個對象都可以由不同的類來實現,並且不能保證每個類都能夠測試其實例與其他實例的相等性。因此,將任意CharSequence實例用作集中的元素或映射中的鍵是不合適的。
想知道爲什麼StringBuffer
不覆蓋equals
方法。可能是因爲該對象的內容通過toString()
方法獲得,並且具有所需的方法。
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類中被覆蓋,以檢查和匹配兩個不同的字符串的內容。
Stringbuffer的equals()
未被覆蓋。它不會比較值,它只會比較參考值分配。這就是爲什麼你會因爲他們都指向不同的對象而變得虛假。
據我所知,StringBuidler不是線程安全的 – Yaneeve 2010-01-06 11:18:06
StringBuilder不是線程安全的。從StringBuilder上的SDK文檔:「與StringBuffer兼容,但**不保證同步**」,從以下的介紹段落開始:http://java.sun.com/j2se/1.5.0/docs/api/ java/lang/StringBuilder.html – 2010-01-06 11:26:17
當然,我的不好。閱讀StringBuffer的文檔太快,IT由StringBuilder填充,因此它意味着供單個線程使用。對不起。 – mkolodziejski 2010-01-06 11:32:05