字符串是不可变的 - 这意味着我永远不应该使用+=,而只使用StringBuffer?

字符串是不可变的,这意味着,一旦创建它们,就无法更改。

那么,这是否意味着,如果你用+=来附加东西,而不是你创建一个StringBuffer并附加文本,它会花费更多的内存呢?

如果你使用+=,你每次都会创建一个新的“对象”,必须保存在内存中,不是吗?


答案 1

是的,每次使用 += 都会创建一个新对象。然而,这并不意味着这总是错误的事情。这取决于你是希望该值作为字符串,还是只是要使用它来进一步构建字符串。

如果您实际上希望将 的结果作为字符串,那么您也可以只使用字符串串联。但是,如果你真的要(比如说)循环并附加另一个字符串,另一个字符串,等等 - 只需要在最末尾将结果作为字符串,那么StringBuffer/StringBuilder就是要走的路。事实上,循环确实是StringBuilder比字符串串联有回报的地方 - 5甚至10个直接串联的性能差异将非常小,但对于数千个人来说,它变得更加糟糕 - 基本上是因为你通过串联获得O(N2)复杂性与StringBuilder的O(N)复杂性。x + y

在Java 5及更高版本中,你基本上应该使用StringBuilder - 它是非同步的,但这几乎总是可以的;想要在线程之间共享一个是非常罕见的。

我有一篇关于所有这些的文章,你可能会发现它很有用。


答案 2

经验法则很简单:

如果在循环中运行串联,请不要使用+=

如果您没有在循环中运行串联,则 使用 根本无关紧要。(除非是性能关键型应用程序+=