簡體   English   中英

StringBuilder.append鏈是否比字符串連接更有效?

[英]Is chain of StringBuilder.append more efficient than string concatenation?

根據Netbeans的提示名為Use chain of .append方法而不是字符串連接

在StringBuilder或StringBuffer的append方法的調用參數中查找字符串連接。

StringBuilder.append()是否真的比字符串連接更有效?

代碼示例

StringBuilder sb = new StringBuilder();
sb.append(filename + "/");

StringBuilder sb = new StringBuilder();
sb.append(filename).append("/");

您必須平衡可讀性和功能性。

假設您有以下內容:

String str = "foo";
str += "bar";
if(baz) str += "baz";

這將創建2個字符串構建器(您實際上只需要1個)以及臨時的附加字符串對象。 如果你去,你會更有效率:

StringBuilder strBuilder = new StringBuilder("foo");
strBuilder.append("bar");
if(baz) strBuilder.append("baz");
String str = strBuilder.toString();

但作為一種風格問題,我認為第一個看起來很好。 單個對象創建的性能優勢對我來說似乎很小。 現在,如果不是3個字符串,你有10個,20個或100個,我會說性能超過了風格。 如果它是在一個循環中,我肯定會使用字符串構建器,但我認為只需要幾個字符串就可以使用“草率”方式使代碼看起來更清晰。 但是......這里潛藏着一個非常危險的陷阱! 請繼續閱讀(暫停以構建懸念... dun dun dunnnn)

有人說總是使用顯式字符串構建器。 一個基本原理是你的代碼會繼續增長,它通常會以與現有代碼相同的方式進行(也就是說它們不會花時間重構。)所以你最終會得到那些創建的10或20個語句你不需要自己的建設者。 因此,為了從一開始就防止這種情況,他們說總是使用顯式構建器。

因此,雖然在你的例子中,它不會特別快,當未來的某個人決定他們想要一個文件擴展名,或類似的東西,如果他們繼續使用字符串連接而不是StringBuilder,他們會去最終遇到性能問題。

我們還需要考慮未來。 假設您在JDK 1.1中重新編寫Java代碼,並且您有以下方法:

public String concat(String s1, String s2, String s3) {
    return s1 + s2 + s3;
}

那時,它會很慢,因為StringBuilder不存在。

然后在JDK 1.3中,您決定使用StringBuffer使其更快(StringBuilder仍然不存在)。 你做這個:

public String concat(String s1, String s2, String s3) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    sb.append(s3);
    return sb.toString();
}

它變得更快。 真棒!

現在JDK 1.5問世了,隨之而來的是StringBuilder(比StringBuffer更快)和自動轉換

return s1 + s2 + s3;

return new StringBuilder().append(s1).append(s2).append(s3).toString();

但是,由於您明確使用了StringBuffer,因此無法獲得此性能優勢。 因此,通過聰明,當Java變得比你聰明時,你已經造成了性能損失。 所以你必須記住,有些事你不會想到。

好吧,你的第一個例子基本上由編譯器翻譯成了一些東西:

StringBuilder sb = new StringBuilder();
sb.append(new StringBuilder().append(filename).append("/").toString());

是的,這里存在一定的低效率。 但是,在您的計划中是否真的重要是一個不同的問題。 除了有問題的風格(暗示:主觀)之外,如果你在緊密循環中這樣做,通常也很重要。

到目前為止,沒有一個答案明確地解決了提示的具體情況。 它並不是說總是使用StringBuilder#append而不是連接。 但是,如果你已經在使用StringBuilder ,那么在串聯中混合是沒有意義的,因為它會創建一個冗余的StringBuilder (參見Dirk的答案 )和一個不必要的臨時String實例。

幾個答案已經討論了為什么建議的方法更有效,但重點是,如果你已經有一個StringBuilder實例,只需調用append就可以了。 它是可讀的(在我看來,顯然是誰編寫了NetBeans提示),因為你無論如何都要調用append ,而且效率更高一些。

如果你使用大量連接和非常長的字符串,它只會更有效。 對於一般用途,例如在您的示例中創建文件名,任何字符串連接都很好並且更具可讀性。

無論如何,這部分應用程序不太可能成為性能瓶頸。

從理論上講,是的。 因為String對象是不可變的:一旦構造,它們就不能再被更改了。 因此,使用“+”(連接)基本上每次都會創建一個新對象。

實際上沒有。 編譯器足夠聰明,可以用StringBuilder附加替換所有“+”。

有關更詳細的說明: http//kaioa.com/node/59

PS:Netbeans ??? 來吧!

使用此函數可以更快地連接兩個字符串。

但是,如果您有多個字符串或不同的數據類型,則應該顯式或隱式使用StringBuilder。 使用帶字符串的+正在隱式使用StringBuilder。

暫無
暫無

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

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