String +操作底层原理
在阿里巴巴开发手册中说明在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