【发布时间】:2014-10-18 23:47:10
【问题描述】:
过去,我一直认为在构建带有变量的字符串时应该使用StringBuilder 和append(String),而不是string += split[i]。在什么情况下这是准确的?我问是因为通常情况下,如果我要写以下内容:
String[] split = args; // command line arguments or whatever
String myString = "";
for (int i = 0; i < split.length; i++) {
myString += split[i];
}
我的 IDE 告诉我应该将其转换为使用 StringBuilder。但是,写这样的东西:
StringBuilder build = new StringBuilder();
build.append("the ").append(build.toString()).append(" is bad").append(randomvar);
build.toString();
当我应该使用 String 时,IntelliJ 实际上将使用 StringBuilder 列为性能问题。它被列为性能问题这一事实表明它实际上可能会导致问题,而不是只是稍微慢一点。
我确实注意到第一个示例是一个循环,而第二个不是 - 是一个 StringBuilder 推荐用于大量连接,但普通连接更适合非循环情况(这也意味着在循环中运算符 +=将被使用,而在循环之外它可能是"the " + build.toString() + " is bad" + randomVar - 是+=问题而不是+?)
【问题讨论】:
-
这不是很容易测试吗?就像为 10000 个追加 vs + 操作放置一个 for 循环一样。如果字符串是已知的,那么 + 可以被编译器优化。
-
+运算符在整个操作由正好连接两个字符串组成时总是更有效。 -
我认为它不是重复的,因为这更多地在于它在循环中和不在循环中的区别。
-
@DziNeIT 这是重复的。只需检查这些问题的答案,其中也涵盖了循环内的串联。
-
@ajb 这不是过早优化的情况...
标签: java