
對(duì)比背景
- Java中最常用的拼接字符串方法就是 + 或 +=,使用上簡單方便。但如果拼接數(shù)量比較大,例如在循環(huán)中拼接字符串,可能會(huì)有性能問題;
測(cè)試數(shù)據(jù)
- 循環(huán)100000次進(jìn)行String拼接,對(duì)比+=和使用StringBuilder,StringBuffer。運(yùn)行在JDK8,查看循環(huán)耗時(shí)時(shí)間
具體實(shí)現(xiàn)如下
- 使用+=進(jìn)行拼接String
@Test
//使用+=進(jìn)行拼接String
public void testCase1(){
String str = "";
long startTime= System.currentTimeMillis();
for (int i = 0;i< 100000;i++){
str += i;
}
long endTime= System.currentTimeMillis();
System.out.println(endTime-startTime);
}
- 使用StringBuilder
//使用StringBuilder
@Test
public void testCase2(){
StringBuilder stringBuilder = new StringBuilder();
long startTime= System.currentTimeMillis();
for (int i = 0 ; i< 100000;i++){
stringBuilder.append(i);
}
long endTime= System.currentTimeMillis();
System.out.println(endTime-startTime);
}
- 使用StringBuffer
//使用StringBuffer
@Test
public void testCase3(){
StringBuffer str = new StringBuffer();
long startTime= System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str.append(i);
}
long endTime= System.currentTimeMillis();
System.out.println(endTime-startTime);
}
-
執(zhí)行結(jié)果對(duì)比
- 使用+=進(jìn)行拼接String耗時(shí)(單位:毫秒):18301
- 使用StringBuilder耗時(shí)(單位:毫秒):5
- 使用StringBuffer耗時(shí)(單位:毫秒):6
原理分析
-
可以看到在上面的10w次循環(huán)拼接中,直接使用+=拼接的時(shí)間對(duì)比其他兩個(gè)有近3600倍的差距,因?yàn)槊看窝h(huán)java都會(huì)自動(dòng)創(chuàng)建一個(gè)StringBuilder用來做String拼接,然后轉(zhuǎn)化為String賦值給str,造成了大量的對(duì)象創(chuàng)建開銷,反編譯代碼如下
而使用StringBuilder和StringBuffer的情況性能上就好太多了,如果對(duì)總的字符串長度有一個(gè)基本的預(yù)期,可以在new的時(shí)候指定capacity以節(jié)省當(dāng)空間不夠時(shí)擴(kuò)容的開銷。
StringBuffer作為線程安全類,在以前性能是比較差的,因此才有了非線程安全的StringBuilder,但JDK1.6以后由于java對(duì)synchronized鎖做了優(yōu)化(偏向鎖→ 輕量級(jí)鎖→ 重量級(jí)鎖),StringBuffer性能有了極大提升,但習(xí)慣性的在沒有并發(fā)情況下,還是使用StringBuilder
解決方案
當(dāng)有大量字符串拼接需要時(shí),尤其是在循環(huán)中,考慮使用StringBuilder或StringBuffer

