以上代码运行结果为:
可以看到,String创建了大量无用对象,消耗了大量内存耗时上大概是StringBuffer 和 builder的100倍。
当然,我们只循环了10000次,StringBuilder的优势不是很明显,为了防止java 虚拟机 jvm 垃圾回收机制的干扰 我们我StringBuilder 和 StringBuffer 单独拿出来吧循环次数加到10万次、100万次和1000万次测试:
代码吧String部分注释掉,由于循环次数较多,jvm 在运行时会有垃圾回收,内存对比会不正确,也先注释:
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
< 10000000; 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
< 10000000; 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
));
}
}