本文来自程式先锋网站 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