優化字符串操作

本文來自程式先鋒網站 www.javabiz.cn

通過“+”操作符進行字符串連接在Java裏面是最方便的一種做法,但是從內存和性能角度來說,它幾乎是開銷最大的一種操作。
當編譯器看到:

String s = "abc" + someint + somearray[index];
或者其他類型的連接,它實際上生成類似於下面這樣的代碼序列(或者至少字節碼是等同於):

StringBuffer temp = new StringBuffer( );
temp.append( String.valueOf( "abc" ) );
temp.append( String.valueOf( someInt ) );
temp.append( String.valueOf( someArray[index] );
String s = temp.toString( );

這幾句代碼中明顯的缺陷是StringBuffer對象的構造函數:buffer的大小總是16個字符。
然後,當數據被追加到這個buffer中的時候,如果需要更多的空間,buffer的大小將會成倍增長,並且老的數據是被複制到一個新的Buffer中

。所以爲了優化我們不得不設置StringBuffer爲自動增長。本文將給出一個替換指定位置的字符的做法,一個優化後的代碼如下:


public static String replaceCharAt(String s, int pos, char c) {
StringBuffer buf = new StringBuffer( s );
buf.setCharAt( pos, c );
return buf.toString( );
}

只有一個buffer被創建,並且大小正好,轉換一個StringBuffer爲一個String纔可能沒有沒有什麼多餘開銷,好比兩個buffer共享了某些數據

。刪除一個字符串中的一個字符可以這樣優化:
public static String removeChar(String s, char c) {
StringBuffer r = new StringBuffer( s.length() );
r.setLength( s.length() );
int current = 0;
for (int i = 0; i < s.length(); i ++) {
char cur = s.charAt(i);
if (cur != c) r.setCharAt( current++, cur );
}
return r.toString();
}

在早些的版本中,一個新的String對象被創建並且立即被丟棄!
原來版本中的刪除字符的明顯缺陷是當傳入參數大於17個字符的時候,編譯器創建的臨時StringBuffer不得不被膨脹,爲了優化,我們只是改

寫使用正確的StringBuffer大小的方法即可。

public static String removeCharAt(String s, int pos) {
StringBuffer buf = new StringBuffer( s.length() - 1 );
buf.append( s.substring(0,pos) ).append( s.substring(pos+1) );
return buf.toString();
}

本文來自程式先鋒網站 www.javabiz.cn
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章