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

修改当前对象时,java中的旧字符串对象会发生什么变化,java,Java,我在尝试使用字符串时遇到了一个疑问。 我知道字符串在java中是不可变的,即使我们对当前字符串执行任何字符串操作,它也会创建一个新的字符串对象。例如,如果我将trim()应用于当前字符串对象,则它将创建新对象。所以我的问题是,旧字符串对象会发生什么情况。无论它是从堆中移除,还是替换为新对象,或者在另一种情况下,如果我执行大量字符串函数,它都会继续创建字符串垃圾。请澄清一下 无论它是从堆中移除,还是替换为新对象,或者在另一种情况下,如果我执行大量字符串函数,它都会继续创建字符串垃圾 没有对象“替换

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

无论它是从堆中移除,还是替换为新对象,或者在另一种情况下,如果我执行大量字符串函数,它都会继续创建字符串垃圾

没有对象“替换”堆上的另一个对象。它们都是在新位置创建的。任何碰巧仍然引用“旧”对象的人都可以继续使用它


所以,是的,您将产生“字符串垃圾”。但垃圾收集器要处理这一点:它在后台删除未使用的对象(回收它们的内存以供将来的对象重用)。如果你碰巧在一个紧凑的循环中做很多字符串操作,考虑使用<代码> StringBuilder < /C> >或<代码> char []/Cord>。它们的存在正是为了避免创建大量中间对象的开销。

您似乎有一个误解。当您调用一个字符串操作时,所发生的事情是您得到一个包含该操作结果的新字符串。旧字符串没有发生任何变化

比如说

String strWithSpaces = "   Dog   ";
String strWithoutSpaces = strWithSpaces.trim();
现在有两个单独的字符串。一个在单词“Dog”前后都有空格,另一个没有空格

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

String strWithSpaces = "   Dog   ";
strWithSpaces.trim();
实际上,这会创建一个在“Dog”前后没有空格的新字符串,但是这个新字符串没有分配给任何对象,因此它可以立即进行垃圾收集,带有空格的旧字符串保持原样

如果我这样做了

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

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

显然,它不会发生任何变化。你甚至可以自己轻松地测试一下。