簡體   English   中英

什么是比較 StringBuilder 對象的有效方法

[英]What is an efficient way to compare StringBuilder objects

我有兩個 StringBuilder 對象,我需要用 Java 比較它們。 我知道我能做的一種方法是

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

但這意味着我正在創建兩個 String 對象,是否有更好的方法來比較 StringBuilder 對象。 可能不需要創建其他對象的地方?

正如您顯然已經知道的那樣, StringBuilderjava.lang.Object繼承了equals() ,因此StringBuilder.equals()只有在將相同的對象作為參數傳遞時才返回 true。 比較兩個StringBuilder的內容!

如果您查看源代碼,您會得出結論,最有效的比較(不涉及創建任何新對象)是比較.length()返回值,然后如果它們相同,則比較返回值每個字符的charAt(i)值。

自 Java 11 起, StringBuilder實現了Comparable ,因此您可以使用compareTo方法進行相等性測試:

System.out.println(sb1.compareTo(sb2) == 0);

兩個 StringBuilder 對象永遠不相等。 使用.toString() 獲取兩個對象的字符串表示,然后使用.equals() 比較對象。 這樣,調用 String 類的 equals() 方法比較對象的字符串值,而不是比較內存位置。

StringBuilder a= new StringBuilder("HELLO JAVA");
StringBuilder b= new StringBuilder("HELLO JAVA");
if (a.toString().equals(b.toString())){
System.out.println("Objects are equal");
}

沒有新分配的解決方案是首先比較長度,如果不同,則逐個字符進行比較。 這比在 StringBuilder 調用上通過 toString() 執行比較更有效、更快,后者將分配一個新字符串。

下一個片段假定兩個參數都不為空,也不是同一個對象實例:

public boolean compare(final StringBuilder left, final StringBuilder right) {
    final int length = left.length();

    if (length != right.length())
        return false;

    for (int index = 0; index < length; index++) {
        if (left.charAt(index) != right.charAt(index))
            return false;
    }

    return true;
}

您可以使用String的contentEquals()方法。

StringBuilder s = new StringBuilder("abc");
StringBuilder t = new StringBuilder("def");

if(s.contentEquals(new String(t)) {
    System.out.println("Same");
}

暫無
暫無

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

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