为什么我的这个程序的字符串“+拼接”比StringBuilder的“append拼接”快呢?

方法一:sbbb.append("1"+"aaaaaa"+"2");方法二:sbb.append("1");sbb.append("aaaaaa");sbb.append... 方法一:
sbbb.append("1" + "aaaaaa" + "2");
方法二:
sbb.append("1");
sbb.append("aaaaaa");
sbb.append("2");

经过测试,发现方法一所用的时间比方法二的时间短。
这让我有些疑惑了,明明是StringBuilder的速度比String快,这个程序,怎么反过来了。
源代码:
import java.util.Date;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
int k = 0;
for (int d = 0; d < 1000 ; d++) {

Date start1 = new Date();
StringBuilder sbbb = new StringBuilder();
for (int b = 0; b <9999999; b++) {
sbbb.append("1" + "aaaaaa" + "2");
}
long plus = new Date().getTime() - start1.getTime();
Date start = new Date();
StringBuilder sbb = new StringBuilder();
for (int a = 0; a < 9999999; a++) {
sbb.append("1");
sbb.append("aaaaaa");
sbb.append("2");
}
long append = new Date().getTime() - start.getTime();
if (append > plus) {
k++;
}
}
System.out.println("append > plus有" + k + "次");
}
}
展开
 我来答
漫步的小鱼儿
2014-02-27 · 超过15用户采纳过TA的回答
知道答主
回答量:39
采纳率:0%
帮助的人:32.8万
展开全部
这种结果是正常的,因为你的循环数量特别大,大部分时间分配给了循环,当使用+的时候sbbb.append("1" + "aaaaaa" + "2");,括号中的静态字符串会相加(底层是使用StringBuilder的append()方法实现的),相加之后,在字符串的静态缓存区就会存在一个新的静态字符串“1aaaaaa2”,当下次循环再调用这个语句:sbbb.append("1" + "aaaaaa" + "2")时,String的优化机制已经记住了这个表达式("1" + "aaaaaa" + "2"),会把这个表达式直接转换为静态缓存区中的"1aaaaaa2",
也就是说从第二次循环开始就做了这样的操作:sbbb.append("1aaaaaa2");,而不是重新去计算("1" + "aaaaaa" + "2")的结果。下面的语句sbb.append("1"); sbb.append("aaaaaa"); sbb.append("2");从第二次循环开始,每次还是调用三次append()方法,而上面的刚才说了,从第二次开始只是调用了一次append()方法而已。
另外,在使用StringBuilder的时候最好指定初始容量,一般有个默认初始容量,如果不指定,比如你要操作的长度为256,而初始长度只是16,它就会扩大缓存区,影响效率,所以可以预知字符串大小时,最好指定初始容量,以便提升效率,比如StringBuilder sb = new StringBuilder(256);
百度网友8b3be27
2014-02-27 · TA获得超过379个赞
知道小有建树答主
回答量:682
采纳率:0%
帮助的人:289万
展开全部
+在简短和不频繁的操作时性能还是很好的,反过来StringBuffer就好
追问
你看看我的程序,还不频繁啊?而且我用的是StringBuilder,不是StringBuffer。一般的,StringBuilder比StringBuffer速度更快啊。
追答
"1" + "aaaaaa" + "2" 这只会创建一次1aaaaaa2,以后每次都直接使用一次性追加到sbbb,第二个会缓存3个字符串,循环一次要追加3次才能完成,还有你这样测试也不够严谨啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
powderSnow
2019-02-19
知道答主
回答量:8
采纳率:0%
帮助的人:6494
展开全部

这并不是在第一次循环后才进行的优化,而是在编译期进行的优化。在sbbb.append("1" + "aaaaaa" + "2"); 这条语句中,"1" + "aaaaaa" + "2"并不是在在第一次执行后才被优化成 "1aaaaaa2" 的。javac编译器在编译过程中进行标注检查时就会把 "1" + "aaaaaa" + "2" 优化成 "1aaaaaa2",这个优化过程被称为“常量折叠”(可参考《深入了解Java虚拟机》第二版 10.2.4 语义分析与字节码生成 - 周志明、CSDN博客 - Java常量折叠 - N3verL4nd:网页链接、博客园 - java之常量折叠 - Kevin_zheng:网页链接等等)。因此第一种方法从第一次循环开始就已经是 sbbb.append("1aaaaaa2"); 了,所以会比第二种方法快。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式