修改当前对象时,java中的旧字符串对象会发生什么

时间:2017-09-18 09:17:17

标签: java

我在尝试string课时遇到了疑问。 我开始知道字符串在java中是不可变的,即使我们对当前字符串执行任何字符串操作,它也会创建一个新的字符串对象。例如,如果我将trim()应用于当前字符串对象,那么它将创建新对象。所以我的问题是旧的字符串对象会发生什么。是否从堆中删除替换为新对象,或者在其他情况下,如果我执行大量字符串函数,它将继续创建字符串垃圾。请澄清一下?

2 个答案:

答案 0 :(得分:1)

  

是否从堆中删除替换为新对象,或者在其他情况下,如果我执行大量字符串函数,它将继续创建字符串垃圾。

永远没有任何对象"取代"堆上的另一个对象。它们都是在新的位置创建的。任何碰巧仍然参考" old"对象可以继续使用它。

所以,是的,你将生产"字符串垃圾"。但是你有垃圾收集器来处理它:它在后台删除未使用的对象(回收它们的内存以供将来的对象重用)。如果您恰好在紧密循环中执行了大量字符串操作,请考虑使用StringBuilderchar[]。这些存在正是为了避免创建大量中间对象的开销。

答案 1 :(得分:1)

你似乎有一种误解。当您调用字符串操作时,会发生一个带有该操作结果的新字符串。旧字符串没有任何反应。

例如

String strWithSpaces = "   Dog   ";
String strWithoutSpaces = strWithSpaces.trim();

现在你有两个单独的字符串。一个在“Dog”之前和之后有空格的,而一个没有空格。

你可能会问,如果我这样做会发生什么

String strWithSpaces = "   Dog   ";
strWithSpaces.trim();

嗯,从某种意义上说,这会创建一个没有“Dog”之前和之后的空格的新字符串,但是新字符串没有分配给任何东西,所以它立即有资格进行垃圾收集,旧字符串,空格,保持原样

如果我这样做

String strWithSpaces = "   Dog   ";
strWithSpaces = strWithSpaces.trim();

同样,有两个字符串。但现在,新字符串被赋予与旧字符串相同的变量。所以你有一个新的引用,你可以使用它,但你没有直接引用旧的。如果它不是从文字字符串创建的,那么它将被垃圾收集。