优化字符串操作
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://772708707.blog.51cto.com/259734/62304 |
本文来自程式先锋网站 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 本文出自 “程式先锋Java培训” 博客,请务必保留此出处http://772708707.blog.51cto.com/259734/62304 本文出自 51CTO.COM技术博客 |


java_lina
博客统计信息
热门文章
最新评论
友情链接