从头认识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比+号来的性能好。


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

-----------------------------------

目录




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值