面试过Java的很多人都被问过这么一个问题:为什么要尽量用StringBuilder的append去拼接字符串,而不用string的“+”进行拼接?
这个问题网上的答案就很多,也比较近似,大致就是:String类本身是final类型,他不能更改,所以拼接时,它会使用StringBuilder,并调用append,之后再调用toString方法,每次都要这样,StringBuffer再转换成String时,代价是很大的。这是它慢的主要的一些原因。不仅创立了临时对象StringBuffer,还每次完后再要转成String。
如下的代码也能验证:
long start = 0L;
long end = 0L;
String str = "Hello";
String str1 = "Hello";
String str2 = "World";
start = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {// 进行十万次循环
str = str+str2;
}
end = System.currentTimeMillis();
System.out.println("使用string的时间是:" + (end - start) + "毫秒!");
结果为:使用string的时间是:14529毫秒!
但是,改一改代码把str=str+str2
改为str=str1+str2
。代码如下:
start = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {// 进行十万次循环
str = str1 + str2;
}
end = System.currentTimeMillis();
System.out.println("使用string的时间是:" + (end - start) + "毫秒!");
结果就会变为:使用string的时间是:8毫秒!
而这个为什么就很快的原因就很难找了,最后我在一个不太相关的博客里找到了思路:jvm对String类有常量优化机制,s1 = “a” + “b” + “c”;代码在编译的时候就会生成String s1 = “abc”;会在常量池创建一个"abc",直接把引用指向"abc"。所以循环再多也是直接把引用指向常量池里的“abc”而已,所以速度也就快了