老生常談之Java字串拼接
本文講解Java語言中常見的幾種字串拼接方式的特點及其使用情形。
1. plus方式
當左右兩個量其中有一個為String型別時,用plus方式可將兩個量轉成字串並拼接。
String a="";
int b=0xb;
String c=a+b;
若”+”操作符的底層實現是用Java寫的,預測其中一部分可能長這個樣:
native int plus(int a,int b);
native double plus(double a,double b);
//...(plus過載)
String plus(String a,Object b){
return String.valueOf(a).concat(String.valueOf(b));
}
String plus(Object a,String b){
return String.toString(a).concat(String.valueOf(b));
}
2. concat方式
當兩個量都為String型別且值不為null時,可以用concat方式。
String a="a";
String b="b";
String c= a.concat(b);
理論上,此時拼接效率應該最高,因為已經假定兩個量都為字串,做底層優化不需要額外判斷或轉換,而其他方式無論如何優化,都要先走到這一步。
3. append方式
當需要拼接至少三個量的時候,可以考慮使用StringBuffer#append()以避免臨時字串的產生
StringBuffer buf=new StringBuffer()
buf.append("a");
if(someCondition){
buf.append("b");
}
buf.append("c");
String d=buf.toString();
當a,b,c拼接起來會很長時,可以給在構造器中傳入一個合適的預估容量以減少因擴充套件緩衝空間而帶來的效能開銷。
StringBuffer buf=new StringBuffer(a.length()+b.length()+c.length());
JDK對外提供的一些涉及可append CharSequence的引數或返回值型別往往是StringBuffer型別,畢竟安全第一,而StringBuffer大多數情況(包括append操作)執行緒安全。
若不會出現多執行緒同時對一例項併發進行append操作,建議使用非執行緒安全的StringBuilder以獲得更好效能
4. 其他
若需拼接至少三個量,只用一個連續拼接的語句就可完成時,從使程式碼簡潔角度考慮,用plus方式。
String a="a";
String b="b";
String c="c";
String d=a+b+c;
此時,第4句經JDK編譯後其位元組碼(或)會自動優化為等效於下列程式碼編譯後的位元組碼。
String d=new StringBuilder().append(a).append(b).append(c).toString();
若採用模板+引數來替換佔位符的方式或需同時對要拼接日期/數字進行格式化,可以用String.format()來實現
String c=String.format("a %s!","b");
此方式資源佔用/耗時相對會稍多,畢竟首先要解析模板。當用方法封裝並進行format條件呼叫時,整體效率也不算差。
總結
上述幾種字串拼接方式各有特長,很難單說誰誰誰更好。
既然高效(高速,低耗)、簡潔(簡短,易讀)、靈活(易改)難以兼得,我們能做的就是:看情況,作取捨。
作者經驗水平有限,以上內容若已過時,敬請指出。