1. 测试代码:
2. 结果输出:
用操作符串联两个字符串: 22625ms
用StringBuffer串联两个字符串: 0ms
用StringBuilder串联两个字符串: 32ms
3. 说明:
(1) String str = "first string";
str = str + "second string";
上面的字符串"first string"创建后是无法改变的,而它的引用却可以改变。
这个字符串的引用是str,它最初指向字符串"first string",在上面的代码中它
被改变成指向str与"second string"串联后的新的字符串。
(2) String str = "first string";
StringBuffer sbf = new StringBuffer(str);
sbf.append("second string");
str = sbf.toString();
上面代码的意思是:将两个字符串串联后并且拷贝到一个临时字符串缓冲区变量中。
因此有一个应用String类的基本规则:最好通过StringBuffer来构建一个字符串对象。这样可以获得更好的系统性能。
package boke.string;
/**
* 字符串累加与性能优化
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.05.25
*
*/
public class AppendString {
/**
* @param args
*/
public static void main(String[] args) {
final int N = 100000;
long a1 = System.currentTimeMillis();
String s1 = "";
for (int i = 1; i <= N; i++) {
s1 += "#";
}
long a2 = System.currentTimeMillis();
System.out.println("用操作符串联两个字符串: " + (a2 - a1) + "ms");
StringBuffer sbf = new StringBuffer();
a1 = System.currentTimeMillis();
for (int i = 1; i <= N; i++) {
sbf.append("#");
}
a2 = System.currentTimeMillis();
System.out.println("用StringBuffer串联两个字符串: " + (a2 - a1) + "ms");
StringBuilder sbl = new StringBuilder();
a1 = System.currentTimeMillis();
for (int i = 1; i <= N; i++) {
sbl.append("#");
}
a2 = System.currentTimeMillis();
System.out.println("用StringBuilder串联两个字符串: " + (a2 - a1) + "ms");
}
}
2. 结果输出:
用操作符串联两个字符串: 22625ms
用StringBuffer串联两个字符串: 0ms
用StringBuilder串联两个字符串: 32ms
3. 说明:
(1) String str = "first string";
str = str + "second string";
上面的字符串"first string"创建后是无法改变的,而它的引用却可以改变。
这个字符串的引用是str,它最初指向字符串"first string",在上面的代码中它
被改变成指向str与"second string"串联后的新的字符串。
(2) String str = "first string";
StringBuffer sbf = new StringBuffer(str);
sbf.append("second string");
str = sbf.toString();
上面代码的意思是:将两个字符串串联后并且拷贝到一个临时字符串缓冲区变量中。
因此有一个应用String类的基本规则:最好通过StringBuffer来构建一个字符串对象。这样可以获得更好的系统性能。