当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

robert

拥有积分:99
这家伙太懒,还没有签名!

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

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

robert 发表于 1年前 (2015-12-01 13:50:26)  |  评论(0)  |  阅读次数(298)| 0 人收藏此文章,   我要收藏   

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


分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183