Re: [翻譯] 拆穿 Java StringBuilder 的謠言
※ 引述《cyclone350 (老子我最神)》之銘言:
: : 推 AI3767:那篇在迴圈內+=, 不是一次性加起來, 確實很高可能造成變慢 04/01 23:46
: : → cha122977:可以請教為何 str+=str; 會重複宣告嗎?不太明白 04/01 23:56
: 大概看懂版主跟那篇文章是啥意思了,我用白話一點 (有務請修正)
: 如果你的程式碼長這樣
: String str = '';
: while(i < 100000) {
: str += 'a';
: }
: jdk 會把迴圈解釋成像這樣
: while(i < 100000) {
: str = new StringBuilder(str).append('a');
: }
: 但是如果你自己用 StringBuilder 的話會是這樣用
: StringBuilder str = new StringBuilder();
: while(i < 100000) {
: str.append('a');
: }
: 所以差在的時間應該很明顯在哪邊 !!
: 雖然 + 號會被解釋成 append,但是他不是萬用的
: 在某些情況仍需要自行使用 StringBuilder 來提升效能
: 這應該就是那邊文章的結論 !?
這一串討論看來有些紊亂。
我本來以為多數的人都已經知道在回圈內使用 operator + 來串接字串做累加的
恐怖(在時間與空間上)與原因,畢竟 JWorld@TW 上這一篇文章已掛了好多年了。
http://www.javaworld.com.tw/jute/post/view?bid=29&id=15160&sty=1&tpg=3&age=-1
在程式碼中一個以 operator + 串接多個 sub-expression 的 expression 在編譯
其會被編譯器換成 StringBuffer(for Java 1.5-)/StringBuilder(for Java 1.5+)
的多個操作(若是各 sub-expression 都是編譯期常數,則整個 expression 由
編譯器替換成一個常數)。
通常臨時要把多個數值組合成一個字串時,直接用 operator + 串起來是無大礙。
但偏偏許多初心者很喜歡用在回圈裡使用 operator + 來集成一個最後的結果字串,
如同你文中的第一個例子。
這種做法恐怖在對空間與時間上的浪費,把 StringBuffer/StringBuilder 比喻成
筆記簿,這樣子的行為就如同一個人在學期初買了一張紙當筆記簿。
上了一堂課後,發現他的筆記簿已經用完,於是他又去買了兩張紙當作新
筆記簿,還記得先把前一本筆記簿(一張紙)的內容抄寫過來。
上了第二堂課,又發現筆記簿用完了,於是再去買三張紙成為新筆記簿,也記得
把前一本筆記簿(兩張紙)的內容抄寫到新筆記簿裡。
上了第三堂課,又發現筆記簿用完了,於是再去買四張紙成為新筆記簿,也記得
把前一本筆記簿(三張紙)的內容抄寫到新筆記簿裡。
...
...
...
到了學期末最後一堂,他發現他獲得了一本厚達 1000 張的完美筆記,以及...
他曾有過的筆記簿群共 499500 張紙,記不清他用掉多少筆在抄寫上,與多少勞力
與時間在重復抄寫上。
[傻瓜第四部曲.完]
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.172.187.57
推
04/02 01:57, , 1F
04/02 01:57, 1F
→
04/02 03:37, , 2F
04/02 03:37, 2F
→
04/02 08:58, , 3F
04/02 08:58, 3F
→
04/02 09:14, , 4F
04/02 09:14, 4F
推
04/02 11:33, , 5F
04/02 11:33, 5F
推
04/03 02:00, , 6F
04/03 02:00, 6F
討論串 (同標題文章)