您的位置:首页 > 编程语言 > Java开发

Java中字符串累加的性能优化

2007-12-18 11:20 260 查看
String类是Java语言中重要的核心类,在实际开发中也是经常用到的字符串类。Java语言中的String代表了字符串类型的对象,它可以存储16位的Unicode字符序列及其长度。
在Java语言中,String类是被声明为final类型的,String对象一旦被创建,这个字符串就是恒定不变的,例如:
… …
String str = “This is a string”;
Str = str +”another string”;
… …
上面的字符串”This is a string”,创建后是无法改变的,而它的引用(reference)却可以改变,这个字符串的引用是str,它起初指向字符串“This is a string”,而后它改变为指向str与”another string”串联后的字符串。上面例子的内部实现代码类似于下面的代码:
… …
String str = “This is a string”;
StringBuffer tmp = new StringBuffer(str);
tmp.append(”another string”);
str = tmp.toString();
… …
以上代码的意思是:将两个字符串串联后拷贝到一个临时字符串缓冲区变量中,如果这个被拷贝的字符串较长,那么这个拷贝操作就非常耗费资源。因此,一个应用String类的基本规则就是:最好通过StringBuffer来构建字符串对象。通过操作符“+”或者“+=”串联两个字符串相对简便,在一些对应用性能要求不高的产品或项目中是允许的,但是使用操作符的与使用StringBufer.append()方法串联字符串相比,耗费的资源还是比价昂贵的。采用这两种方法串联字符串的性能比较如下:
public class AppendString {
public static void main(String args[]) {final int N = 50000;
// 用操作符串联
long startTime = System.currentTimeMillis();
String s1 = "";
for (int i = 0; i < N; i++) {
s1 = s1 + "*";
}
long endTime = System.currentTimeMillis();
System.out.println("用操作符串联:" + (endTime - startTime + "ms"));
// 通过StringBuffer串联
startTime = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();for (int i = 0; i < N; i++) {
sb.append("*");
}
String s2 = sb.toString();
endTime = System.currentTimeMillis();
System.out.println("通过StringBuffer串联:" + (endTime - startTime + "ms"));
}
}
上面的例子分为两部分,两部分分别同过操作符和StringBufer.append()方法对两个字符串重复串联50000次,并打印完成串联所需时间。
编译运行这个例子,其输出在我的机上如下:
用操作符串联:4466ms
通过StringBuffer串联:2ms
通过上面的例子可以看出,两种方法之间的差异还是相当明显的。基于上面的分析,在实际的应用设计中,建议尽量使用StringBufer.append()方法来处理字符串的串联操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: