2012-08-13 56 views

回答

53

如上所述,您不应使用StringBuilder而不是简单的字符串连接表达式,如a + " = " + b。后者键入速度更快,更易于阅读,编译器在内部也会使用StringBuilder,所以重写它不会有性能优势。

但是,如果您在循环中连接大量字符串,则StringBuilder非常有用。以下代码效率低下。它需要O(n )运行时间并创建许多临时字符串。

String result = ""; 
for (int i = 0; i < foo.length; ++i) 
{ 
    result += bar(foo[i]); // Bad 
} 

试试这个:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < foo.length; ++i) 
{ 
    sb.append(bar(foo[i])); 
} 
String result = sb.toString(); 

编译器优化了只有简单的a + b + c表达式。它不能自动优化上述代码。

+3

@JohanSjöberg是的,事实上它的确如此。执行'result + = bar(foo [i])'会产生像(假设为javac)'result = new StringBuilder()。append(result).append(foo [i])。toString()'的代码。注意这比使用一个'StringBuilder'完成更多的工作。 – oldrinb 2012-08-13 21:18:04

+0

@JohanSjöberg关键是__样本不等于___ – oldrinb 2012-08-13 21:19:12

+0

我还没那么清楚为什么?是否因为它需要在对第一个样本进行连接之前复制旧字符串(之前)? – peter 2012-08-13 21:21:04

3

你在哪里假设字符串连接在内部使用stringbuilder?也许一个简单的concat得到优化,但这绝对不会:

String s = ""; 

for (int i = 0; i < 1000; i++){ 
    for (int j = 0; j < 1000; j++){ 
    s+= "" + i + j 
} 
} 
+1

那么这是什么内部? – peter 2012-08-13 21:14:22

+0

@ user1389813's = new StringBuilder.append(“”)。append(i).append(j).toString();' 推测编译器是javac。 – oldrinb 2012-08-13 21:19:39

+0

所以每次它会创建一个新的StringBuilder来执行连接,所以这就是为什么它很糟糕,缓慢,正确? – peter 2012-08-13 21:25:10

相关问题