从头认识java-11.2 +与StringBuilder

这一章节我们来讨论一下字符串里面的"+"与StringBuilder。

1.例子

package com.ray.ch11;public class Test {public static void main(String[] args) {String a = "a" + "b" + "c";String d = a + "d";}}我们在这里使用java的一个分析程序的命令javap来看一下class里面究竟是怎么执行的?

大家注意红框里面的两句:

(1)编译器为“a”+"b"+"c"进行了优化,直接变成了"abc"

(2)第二句是来源于a+"d",它首先new一个StringBuilder出来,然后再进行相加,这个也是编译器优化的结果。

但是,对于这种编译器的优化,也是有限度的,而且在某种情况反而是累赘。

2.性能对比测试

我们下面给出的例子,就是对比“+”与StringBuilder之间性能的问题。

使用“+”:

package com.ray.ch11;public class Test {public static void main(String[] args) {String a = "";long startTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {a += "a";}long endTime = System.currentTimeMillis();System.out.println(endTime – startTime);}}输出:

20031

使用StringBuilder:

package com.ray.ch11;public class Test {public static void main(String[] args) {StringBuilder sb = new StringBuilder();long startTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {sb.append("a");}long endTime = System.currentTimeMillis();System.out.println(endTime – startTime);}}输出:

16

对比两者的输出,得出非常悬殊的比较结果,就是使用”+“的性能远远的低于使用StringBuilder。

为什么?

我们来看下面两幅图:

下图是第一组代码的javap图:

上面描述的是循环100000遍,然后红框的地方就是new了100000次,每一次new都耗费大量的时间,因此,时间非常的长。

下图是第二组代码的javap图:

红框里面的代码,只是new了一次StringBuilder,下面的都是一直在这个对象上面append字符串,因此大大减少了执行的时间。

结论:

(1)大部分的情况下,编译器都会为我们的字符串进行优化

(2)在某些极端的情况下,编译器的优化则是会出现性能的问题。

(3)使用”+“,在编译器看来只是使用Stringbuilder而已。

总结:这一章节简单介绍了"+"与StringBuilder,并对两者进行了性能的对比。

———————————————分割线————————————————-

首先感谢沉默王二提出宝贵的意见。

鉴于有读者提出上面的测试场景有不妥的地方,我在这里做出解释:

就一般的情况来说,我们通常都会使用+号来连接字符串,但是对于极端情况(例如上面的多字符串相加),就必须使用stringbuilder了。

上面的测试只是证明了在极端情况下stringbuilder比+号来的性能好。

这一章节就到这里,谢谢。

———————————–

不义而富且贵,于我如浮云。

从头认识java-11.2 +与StringBuilder

相关文章:

你感兴趣的文章:

标签云: