場景
java開發(fā)手冊中對于循環(huán)體中進(jìn)行字符串的拼接要求如下:
【推薦】循環(huán)體內(nèi),字符串的連接方式,使用 StringBuilder 的 append 方法進(jìn)行擴展。
說明:下例中,反編譯出的字節(jié)碼文件顯示每次循環(huán)都會 new 出一個 StringBuilder 對象,然后進(jìn)行 append操作,
最后通過 toString 方法返回 String 對象,造成內(nèi)存資源浪費。
并且還提供了反例:
?? String str = "start";
????for (int i = 0; i < 100; i++) {
???????? str = str + "hello";
????}
Java中字符串占位替換、字符串拼接、字符串與Collection互轉(zhuǎn)的方式:
Java中字符串占位替換、字符串拼接、字符串與Collection互轉(zhuǎn)的方式_霸道流氓氣質(zhì)的博客-CSDN博客
字符串的拼接的幾種方式可以參考上面的博客。
除了使用+拼接字符串之外,還可以使用 String 類中的方法 concat 方法來拼接字符串。
示例代碼:
??????? String a = "a";
??????? String b = "b";
??????? String c = a.concat(b);
??????? System.out.println(c);
注:
博客:
霸道流氓氣質(zhì)的博客_CSDN博客-C#,架構(gòu)之路,SpringBoot領(lǐng)域博主
下面看一下Java中String的concat方法的源碼
??????? //??? public String concat(String str) {
??????? //??????? int otherLen = str.length();
??????? //??????? if (otherLen == 0) {
??????? //??????????? return this;
??????? //??????? }
??????? //??????? int len = value.length;
??????? //??????? char buf[] = Arrays.copyOf(value, len + otherLen);
??????? //??????? str.getChars(buf, len);
??????? //??????? return new String(buf, true);
??????? //??? }
首先創(chuàng)建一個字符數(shù)組,長度是已有字符串和待拼接字符串的長度之和,再把兩個字符串的值復(fù)制到新的字符數(shù)組中,
并用這個字符數(shù)組創(chuàng)建一個新的String對象并返回。
為了驗證上面for循環(huán)中讓使用StringBuilder,而不讓使用+,編寫以下代碼并對比耗時
??????? try(Cost cost = new Cost()){
??????????? String aa = "aa";
??????????? for (int i = 0; i < 100000; i++) {
?????????????? aa+="bb";
??????????? }
??????? }
??????? try(Cost cost = new Cost()){
??????????? StringBuilder aa = new StringBuilder();
??????????? for (int i = 0; i < 100000; i++) {
??????????????? aa.append("bb");
??????????? }
??????? }
耗時輸出結(jié)果如下
??????? //cost:11565
??????? //cost:1
?
注意這里的代碼耗時統(tǒng)計的方式可以參考
Java實戰(zhàn)-基于JDK的LRU算法實現(xiàn)、優(yōu)雅的實現(xiàn)代碼耗時統(tǒng)計(Spring AOP、AutoCloseable方式):
Java實戰(zhàn)-基于JDK的LRU算法實現(xiàn)、優(yōu)雅的實現(xiàn)代碼耗時統(tǒng)計(Spring AOP、AutoCloseable方式)_霸道流氓氣質(zhì)的博客-CSDN博客
分析原因:
在for循環(huán)中,每次都是new了一個StringBuilder,然后再把String轉(zhuǎn)成StringBuilder,再進(jìn)行append。
而頻繁的新建對象當(dāng)然要耗費很多時間了,不僅僅會耗費時間,頻繁的創(chuàng)建對象,還會造成內(nèi)存資源的浪費。
為了驗證以上原因,我們對使用+進(jìn)行拼接字符串的代碼進(jìn)行反編譯查看
?
總結(jié):
經(jīng)過對比,我們發(fā)現(xiàn),直接使用StringBuilder的方式是效率最高的。
因為StringBuilder天生就是設(shè)計來定義可變字符串和字符串的變化操作的。
但是,還要強調(diào)的是:
?1.如果不是在循環(huán)體中進(jìn)行字符串拼接的話,直接使用+就好了。文章來源:http://www.zghlxwxcb.cn/news/detail-472552.html
2.如果在并發(fā)場景中進(jìn)行字符串拼接的話,要使用StringBuffer來代替StringBuilder文章來源地址http://www.zghlxwxcb.cn/news/detail-472552.html
到了這里,關(guān)于Java開發(fā)手冊中為什么不建議在for循環(huán)中使用“+“進(jìn)行字符串操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!