优化字符串操作

来源:互联网 发布:工商局网络合同监管 编辑:程序博客网 时间:2024/04/29 08:18
 本文来自程式先锋网站 http://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();
}

 本文来自程式先锋网站 http://www.javabiz.cn