从它们的常用方法可以看出:
String 每次返回的都是新字符串,所以我们使用String的方法操作字符串后不影响原来的字符串;
StringBuffer 和 StringBuilder 返回的都是this,也就是对象本身,所有我们可以在代码中连着写append(xx).append(xxx).append(xxx);
不同的是StringBuffer的方法就加了synchronized 也就是我们说的线程安全。
总结一下:
String StringBuilder StringBuffer效率(性能)测试
我们通过各自拼接10000字符串来比较一下三者在执行时对时间和对内存资源的占用。
下面是测试代码:
package com
.xzlf
.string
;
public class TestString {
public static void main(String
[] args
) {
// 使用 String 进行字符拼接
String str
= "";
long num1
= Runtime
.getRuntime().freeMemory();// 获取系统剩余内存空间
long time1
= System
.currentTimeMillis();
for (int i
= 0; i
< 10000; i
++) {
str
+= i
; // 相当于产生了5000个对象
}
long num2
= Runtime
.getRuntime().freeMemory();
long time2
= System
.currentTimeMillis();
System
.out
.println("String 占用了内存:" + (num1
- num2
));
System
.out
.println("String 占用了时间:" + (time2
- time1
));
// 使用 StringBuilder 进行字符串拼接
StringBuilder sb
= new StringBuilder("");
long num3
= Runtime
.getRuntime().freeMemory();
long time3
= System
.currentTimeMillis();
for (int i
= 0; i
< 10000; i
++) {
sb
.append(i
);
}
long num4
= Runtime
.getRuntime().freeMemory();
long time4
= System
.currentTimeMillis();
System
.out
.println("StringBuilder 占用了内存:" + (num3
- num4
));
System
.out
.println("StringBuilder 占用了时间:" + (time4
- time3
));
// 使用 StringBuilder 进行字符串拼接
StringBuffer sb2
= new StringBuffer("");
long num5
= Runtime
.getRuntime().freeMemory();
long time5
= System
.currentTimeMillis();
for (int i
= 0; i
< 10000; i
++) {
sb2
.append(i
);
}
long num6
= Runtime
.getRuntime().freeMemory();
long time6
= System
.currentTimeMillis();
System
.out
.println("StringBuffer 占用了内存:" + (num5
- num6
));
System
.out
.println("StringBuffer 占用了时间:" + (time6
- time5
));
}
}