在拼接字符串時我們通常會有兩種方法,一種是用String類重載‘+’運算符進行拼接,本質上是調用StringBuilder.append。還有一種類似C的printf風格,調用String.format(),底層是調用formatter.format方法。那從性能和內存占用兩個方面考慮到底是哪一個方法更好呢?
做了一個小小的實驗.注意測試的時候注釋掉非測試方法,免得內存占用會被其他的方法影響.
class StringTest {
public static void main(String[] args) {
// testOperatorPlus();
//testAppend();
testFormat();
}
private static void testFormat() {
Runtime runtime = Runtime.getRuntime();
long memory;
long prev_time;
int i;
long time;
StringBuilder sb = new StringBuilder();
memory = runtime.freeMemory();
prev_time = System.currentTimeMillis();
for (i = 0; i < 10000; i++) {
String s = String.format("Blah %d Blah %d Blah %d", i, i, i);
}
long ww=runtime.freeMemory();
time = System.currentTimeMillis() - prev_time;
memory = memory - ww;
System.out.println("Time: " + time + " Memory Usage: " + memory);
}
private static void testAppend() {
Runtime runtime = Runtime.getRuntime();
long memory;
long prev_time;
int i;
long time;
StringBuilder sb = new StringBuilder();
memory = runtime.freeMemory();
prev_time = System.currentTimeMillis();
for (i = 0; i < 10000; i++) {
sb.append("Blah ");
sb.append(i);
sb.append("Blah ");
sb.append(i);
sb.append("Blah ");
sb.append(i);
}
time = System.currentTimeMillis() - prev_time;
memory = memory - runtime.freeMemory();
System.out.println("Time: " + time + " Memory Usage: " + memory);
}
private static void testOperatorPlus() {
Runtime runtime = Runtime.getRuntime();
long memory;
long prev_time;
int i;
long time;
StringBuilder sb = new StringBuilder();
memory = runtime.freeMemory();
prev_time = System.currentTimeMillis();
for (i = 0; i < 1000000; i++) {
String s = "Blah " + i + "Blah " + i + "Blah " + i;
}
time = System.currentTimeMillis() - prev_time;
memory = memory - runtime.freeMemory();
System.out.println("Time: " + time + " Memory Usage: " + memory);
}
}
結果如下:
| Method | Time(ms) | Memory Usage(long) |
|---|---|---|
| ‘+’ operator | 115 | 28805400 |
| StringBuilder.append | 14 | 884768 |
| String.foramt | 276 | 23175080 |
可以看到StringBuilder.append的執(zhí)行時間和內存占用都是最優(yōu)的。'+'運算符比直接調用StringBuilder.append要慢上不少,特別是要連接的字符串數量較多時,內存占用也特別大。String.format由于每次都有生成一個Formatter對象,較慢也是情理之中。
PS:測試數據少且缺少對比實驗,結論適用性有限,僅供參考。
另見:http://stackoverflow.com/q/925423/5032462