簡體   English   中英

Java字符串緩沖區

[英]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的JavaDocString#equals的確覆蓋了它)。 您必須比較bufferString內容,而不是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。 換句話說, xy必須是同一類的實例。 在這種情況下,您嘗試將StringBufferString進行比較。 對於行為良好的equals()方法,比較兩個不同類的實例將始終為false

為了進行有意義的比較,您需要獲取StringBuffer內容

buffer.toString().equals(newString)

不能等於帶有StringBuffer對象的String對象,請使用:

buffer.toString()。equals(newString)

最好使用StringBuilder ,因為StringBuffer不是TheredSafe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM