[英]Java String Buffer
StringBuffer如何在內部處理字符串? 我嘗試運行以下示例,並得到“字符串不相等”的答案。
據我所知,如果兩個字符串具有相同的值,則equals()返回true。 那么在這種情況下會發生什么呢?
class StringBufferTest {
public static void main(String[] args) {
String newString = "HelloWorld";
StringBuffer buffer = new StringBuffer(newString);
if (buffer.equals(newString)) {
System.out.println("Strings are equal");
} else {
System.out.println("String are unequal");
}
}
}
您正在將StringBuffer
的實例與String
的實例進行比較,這對於使用不同的類型將不會產生預期的結果。 需要注意的是StringBuffer
將使用普通的Object#equals
因為它不覆蓋它(由著名StringBuffer
的JavaDoc對String#equals
的確覆蓋了它)。 您必須比較buffer
的String
內容,而不是buffer
變量的對象引用:
if (buffer.toString().equals(newString)) {
//...
}
另外,從Java 5開始,最好使用StringBuilder
而不是StringBuffer
。 有關此的更多信息: StringBuilder和StringBuffer之間的區別
equals(
當被比較的兩個對象不是同一類型時返回false。無論所包含的字符串是什么, StringBuffer
都是與String
不同的類型,並且比較永遠不會為真。
buffer.toString.equals(newString)
應該可以工作。
您正在比較:
if (buffer.equals(newString))
實際上是將StringBuffer對象類型與String對象類型進行比較。 那顯然會返回false。
為了從equals
方法返回真值,您需要比較相同類型的對象。
根據官方文件 :
公共布爾等於(Object obj)
指示其他某個對象是否與此對象“相等”。
equals方法對非null對象引用實現對等關系:這是自反的:對於任何非空參考值x,x.equals(x)應該返回true。
它是對稱的:對於任何非空參考值x和y,當且僅當y.equals(x)返回true時,x.equals(y)才應返回true。
它是可傳遞的:對於x,y和z的任何非空引用值,如果x.equals(y)返回true,而y.equals(z)返回true,則x.equals(z)應該返回true。
這是一致的:對於任何非空參考值x和y,只要未修改對象的equals比較中使用的信息,對x.equals(y)的多次調用將始終返回true或始終返回false。
對於任何非null參考值x,x.equals(null)應該返回false。
equals()
合約表示x.equals(y)
僅當x.getClass() == y.getClass()
返回true。 換句話說, x
和y
必須是同一類的實例。 在這種情況下,您嘗試將StringBuffer
與String
進行比較。 對於行為良好的equals()
方法,比較兩個不同類的實例將始終為false
。
為了進行有意義的比較,您需要獲取StringBuffer
的內容 :
buffer.toString().equals(newString)
不能等於帶有StringBuffer
對象的String
對象,請使用:
buffer.toString()。equals(newString)
最好使用StringBuilder
,因為StringBuffer
不是TheredSafe
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.