#架构师之性能优化篇--String与StringBuffer的拼接

例 对下面的代码进行优化

String str = "";
for(int i = 0;i<10;i++){
str +=""+i;
}

说明:在java中,String的+拼接方式不适合使用在大量的拼接场合中。那么这是为什么呢?换句话说,+拼接符在拼接字符串的时候都做了什么呢?我们可以使用Java反编译工具来查看+拼接符到底做了些什么。首先获得含有上面的代码的字节码文件,然后通过uuDeJava.exe反编译工具对字节码文件进行编译:
在这里插入图片描述
会在选中的字节码的目录下生成一个.jad文件,这个.jad文件就是反编译出来的文件。
在这里插入图片描述
反编译的结果如下所示:

String str = "";
for(int i = 0; i < 10; i++){
	str = (new StringBuilder(String.valueOf(str))).append(i).toString();
}

我们看到,String的+拼接符实际上通过创建的StringBuilder的对象的append()方法来完成的,最后再通过toString()方法将其转换为字符串。而在for循环中每次都创建一个StringBuilder的对象,再调用append()方法进行字符串拼接,这种做法十分消耗内存,因此效率是十分低下的。那么怎么优化上面的代码呢?我们可以这样来设想一下,既然是因为再for循环内部创建了对象,那么我们可以将创建对象的任务放到for循环外部去来达到代码优化的目的。因此,你可以这样做:

long start = System.currentTimeMillis();
String str = "";
for(int i = 0;i<1000;i++){
	str +=""+i;
}
long end = System.currentTimeMillis();
System.out.println("time1: "+(end - start));

long start2 = System.currentTimeMillis();
StringBuffer str2 = new StringBuffer();
for(int i = 0;i<1000;i++){
	str2.append(i);
}
long end2 = System.currentTimeMillis();
System.out.println("time2: "+(end2 - start2));
/**output:
time1: 31
time2: 2
*/

从上面的结果我们可以看出,再外面定义StringBuffer对象的方式效率要明显高的多,达到了代码优化的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值