看看以下代码: 将26个英文字母重复加了5000次, String tempstr = "abcdefghijklmnopqrstuvwxyz"; int times = 5000; long lstart1 = System.currentTimeMillis(); String str = ""; for (int i = 0; i < times; i++) { str += tempstr; } long lend1 = System.currentTimeMillis(); long time = (lend1 - lstart1); System.out.println(time); 可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。 也就是46秒。 我们再看看以下代码 String tempstr = "abcdefghijklmnopqrstuvwxyz"; int times = 5000; long lstart2 = System.currentTimeMillis(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < times; i++) { sb.append(tempstr); } long lend2 = System.currentTimeMillis(); long time2 = (lend2 - lstart2); System.out.println(time2);
得到的结果为 16 有时还是 0 所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。 根据上面所说: str += "here"; 的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后 再将StringBuffer toSting(); 所以str += "here";可以等同于 StringBuffer sb = new StringBuffer(str); sb.append("here"); str = sb.toString(); 所以上面直接利用"+"来连接String的代码可以基本等同于以下代码 String tempstr = "abcdefghijklmnopqrstuvwxyz"; int times = 5000; long lstart2 = System.currentTimeMillis(); String str = ""; for (int i = 0; i < times; i++) { StringBuffer sb = new StringBuffer(str); sb.append(tempstr); str = sb.toString(); } long lend2 = System.currentTimeMillis(); long time2 = (lend2 - lstart2); System.out.println(time2); 平均执行时间为46922左右,也就是46秒。 总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高。 作者: 7℃洋 时间: 2012-11-1 20:19
沙发吗?、?作者: 樊鹏飞 时间: 2012-11-1 20:47
StringBuffer是字符串的缓冲区类. 缓冲区是用于存储多个数据的,它也是一种容器. StringBuffer的长度是可变的,数据类型是任意的.
String一旦被赋值,就是一个新的空间,长度不可变,但是它的引用时可以变的.而StringBuffer可以追加数据,使用的同一个空间作者: 王得新 时间: 2012-11-1 20:53
楼上的几位回答的都差不多了,在此就做赘述了,这个问题我以前回答过
在这里贴上代码,代码是演示Stiring\StringBuilder\StringBuffer三者的效率问题
public class StringBuilderTester {
private static final String base = " base string. ";
private static final int count = 1000000;
public static void stringTest() {
long begin, end;
begin = System.currentTimeMillis();
String test = new String();
for (int i = 0; i < count/100; i++) {
test = test + " add ";
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ "millis ......... String");
}
public static void stringBufferTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuffer test = new StringBuffer();
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ "millis ......... StringBuffer");
}
public static void stringBuilderTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuilder test = new StringBuilder();
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ "millis .......... StringBuilder");
}
public static void main(String[] args) {
stringTest();
stringBufferTest();
stringBuilderTest();