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

2019-09-01 21:15发布

字符串是不可变的,这意味着,一旦被创造,他们不能被改变。

那么,这是否意味着,如果你用追加+ =东西比如果您创建一个StringBuffer和附加文本,这将需要更多的内存?

如果您使用+ =,你会创建一个新的“对象”每个必须被保存在内存的时候,你不觉得吗?

Answer 1:

是的,你将创建一个新的对象与+ =各一次。 这并不意味着它总是错的事情,但是。 这取决于你是否需要该值作为一个字符串,还是你只是去用它来达到进一步打造字符串。

如果你真正想要的结果, x + y作为一个字符串,那么你可能也只是使用字符串连接。 但是,如果你真的要(说)环轮和追加另一个字符串,另一个等 - 只需要结果作为在最后一个字符串,然后StringBuffer的/ StringBuilder的是要走的路。 事实上,循环是真的在那里的StringBuilder不负有心人,在字符串连接- 5个甚至10直接级联的性能差异将是非常小的,但几千年就成了差很多-基本上,因为你O(N 2)复杂性级联VS与StringBuilder的O(N)的复杂性。

在Java 5中,你应该基本上使用StringBuilder - 这是不同步的,但是这几乎总是好的; 这是非常罕见的希望线程之间共享一个。

我有一个在所有的这篇文章 ,你可能会发现有用。



Answer 2:

经验法则很简单:

如果你是在一个循环中运行并置,不要使用+=

如果你不是在循环中运行并置,使用+=根本没关系。 (除非性能关键应用



Answer 3:

在Java 5或更高版本,StringBuffer的是线程安全的,所以具有一些开销,你不应该支付的,除非你需要它。 StringBuilder的具有相同的API,但不是线程安全的(即你只能用它内部的单个线程)。

是的,如果你正在构建大型字符串,它是更有效地使用StringBuilder。 这可能是不值得的,通过周围的StringBuilder或StringBuffer的作为API的一部分。 这是太混乱了。



Answer 4:

我同意上面张贴的所有答案,但它会帮助你一点点了解更多关于Java的实现方式。 JVM使用StringBuffers内部编译字符串+运算符(从StringBuffer的Javadoc中 ):

字符串缓冲区由编译器来实现二进制字符串连接运算符+。 例如,代码:

  x = "a" + 4 + "c" 

被编译成等价的:

  x = new StringBuffer().append("a").append(4).append("c") .toString() 

同样地, x += "some new string"等同于x = x + "some new string" 。 你看到我这个打算?

如果你做了很多的字符串连接的,使用StringBuffer的会增加你的表现,但如果你只是做了几个简单的字符串连接的,Java编译器可能会优化它适合你,你不会注意到的差异性能



Answer 5:

是。 字符串是不可改变的。 对于偶尔使用,+ =正常。 如果+ =操作密集型的,你应该转向的StringBuilder。



Answer 6:

但是,垃圾收集器最终会释放旧的字符串一旦有对他们没有引用



Answer 7:

究竟。 如果线程安全不是一个问题,您应该尽管使用StringBuilder。

作为一个方面说明: - 每当你使用字符串(),没有新的char []将被创建,这使得使用它非常有效,例如有可能是使用了同一个后备的char []几个String对象。

此外,编译器会为你做一些优化。 例如,如果你这样做

static final String FOO = "foo";
static final String BAR = "bar"; 

String getFoobar() {
  return FOO + BAR; // no string concatenation at runtime
}

我也不会感到惊讶,如果编译器将使用StringBuilder内部哪里可以优化字符串连接 - 如果不是已经也许在未来。



Answer 8:

我认为它依赖于GC收集与被遗弃的字符串的内存。 这样算下来+ =用字符串生成器肯定会有更快,如果你对字符串操作了很多工作。 但它不应该在大多数情况下的一个问题。



Answer 9:

是的,你会而这正是为什么你应该使用StringBuffer来连接字符串的很多。

还要注意,由于Java 5的,你也应该更喜欢StringBuilder的大部分时间。 这只是某种不同步的StringBuffer。



Answer 10:

你说得对,字符串是不变的,所以如果你想同时做了很多的字符串连接来节省内存,你应该使用StringBuilder而不是+ =。

但是,您可能不会介意。 方案对他们的人权的读者写的,所以你可以清晰去。 如果它是重要的是你优化,你应该第一个配置文件。 除非你的程序是对串的活动非常重加权,很可能会等瓶颈。



Answer 11:

没有

它不会占用更多的内存。 是的,创建新的对象,但旧的被回收。 最后,所使用的内存量是相同的。



文章来源: Strings are immutable - that means I should never use += and only StringBuffer?