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

2025-05-21 06:54:24
推荐回答(3个)
回答(1):

这种结果是正常的,因为你的循环数量特别大,大部分时间分配给了循环,当使用+的时候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);

回答(2):

+在简短和不频繁的操作时性能还是很好的,反过来StringBuffer就好

回答(3):

这并不是在第一次循环后才进行的优化,而是在编译期进行的优化。在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"); 了,所以会比第二种方法快。