在阿里巴巴开发手册中说明在for循环中不要使用String+操作,而推荐使用Stringbuilder,多线程则可以使用Stringbuffer
简单写了一个个demo:
@Test
public void testString() {
String a = "AAA";
String b = "BBB";
String c = a+b;
System.out.println(c);
}
//在for循环中使用String +操作
@Test
public void testStringFor(){
long startTime = System.currentTimeMillis();
System.out.println("开始时间:"+startTime);
String a = new String("AAA");
for (int i = 0; i<2000; i++) {
a += String.valueOf(i);
}
long endTime = System.currentTimeMillis();
System.out.println("结束时间:"+endTime);
long times = endTime - startTime;
System.out.println("最终结果:"+a);
System.out.println("耗时:"+times);
}
//在循环中直接使用Stringbuilder的append方法
@Test
public void testStringBuilderFor(){
long startTime = System.currentTimeMillis();
System.out.println("开始时间:"+startTime);
StringBuilder a = new StringBuilder("AAA");
for (int i = 0; i<2000; i++) {
a = a.append(String.valueOf(i));
}
long endTime = System.currentTimeMillis();
System.out.println("结束时间:"+endTime);
long times = endTime - startTime;
System.out.println("最终结果:"+a);
System.out.println("耗时:"+times);
}
测试结果(第二个test,第三个test):
可以看出使用String +操作 耗时53 而使用Stringbuilder.append 耗时1
那到底是为什么呢?
打开cmd 输入 javap -verbose test.class 回车
得到编译后结果:
可以看到底层String的+操作 都是将String转化为Stringbuilder,然后调用其append方法。
所以上面代码中使用Stringbuilder会快很多,因为省去了把String转换为Stringbuilder,再append这些时间,也避免对象创建,回收这些耗能的操作。
总结:在循环中要大量执行String +操作的时候,使用Stringbuilder,多线程使用StringBuffer