[英]What is an efficient way to compare StringBuilder objects
我有兩個 StringBuilder 對象,我需要用 Java 比較它們。 我知道我能做的一種方法是
sb1.toString().equals(sb2.toString());
但這意味着我正在創建兩個 String 對象,是否有更好的方法來比較 StringBuilder 對象。 可能不需要創建其他對象的地方?
正如您顯然已經知道的那樣, StringBuilder
從java.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.