本文來自程式先鋒網站 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