从头认识java-11.2 "+"与StringBuilder

页面导航:首页 > 软件编程 > Java编程 > 从头认识java-11.2 "+"与StringBuilder

从头认识java-11.2 "+"与StringBuilder

来源: 作者: 时间:2016-01-21 09:39 【

这一章节我们来讨论一下字符串里面的+与StringBuilder。1 例子package com ray ch11;public class Test {public static void main(String[] args) {String a = a + b + c;String d =

这一章节我们来讨论一下字符串里面的+与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,并对两者进行了性能的对比。

 

 

 

 

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<