单线程下对StringBuffer与StringBuilde执行多次 append()以测试性能:
public static void main(String[] args) {
System.gc();
long startTime = System.currentTimeMillis();
long startMemory = Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
// StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(":" + i);
}
long endTime = System.currentTimeMillis();
long endMemory = Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:" + (endTime - startTime));
System.out.println("Memory used:" + (startMemory - endMemory));
}
Time Taken
Value of i | 1000 | 10000 | 100000 | 1000000 | 10000000 |
---|---|---|---|---|---|
StringBuffer | 2 | 11 | 54 | 117 | 1276 |
StringBuilder | 2 | 13 | 39 | 104 | 729 |
Memory used
Value of i | 1000 | 10000 | 100000 | 1000000 | 10000000 |
---|---|---|---|---|---|
StringBuffer | 671112 | 2013312 | 15862896 | 19028992 | 74403720 |
StringBuilder | 671112 | 2684504 | 15192000 | 19004952 | 76290056 |
测试结果显示,在单线程环境下,StringBuilder也 比 StringBuffer 性能更好,这可能是用synchronized加锁的原因
看两者的源码,toString方法除了加锁外还有其他不同:
StringBuilder:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
StringBuffer:
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
待后续验证