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()方法来处理字符串的串联操作。