作者sbrhsieh (十年~)
看板java
标题Re: [翻译] 拆穿 Java StringBuilder 的谣言
时间Tue Apr 2 01:34:44 2013
※ 引述《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
1F:推 NewSpec:这篇正解 经常可以看到有文章在强调这个antipattern 04/02 01:57
2F:→ cha122977:谢谢 我是知道一些守则 但对这些守则的由来不是全盘了解 04/02 03:37
3F:→ swpoker:老实说~除非是有大量处理字串的问题~ 04/02 08:58
4F:→ swpoker:例如SQL字串这种需要道stringbuilder? 04/02 09:14
5F:推 PsMonkey:以前没探究原因,只是单纯记得不要用 + 号 [遮脸] 04/02 11:33
6F:推 BBBroflovski:还好平时有在逛java版 有逛有保佑XD 04/03 02:00