我在尝试string
课时遇到了疑问。
我开始知道字符串在java中是不可变的,即使我们对当前字符串执行任何字符串操作,它也会创建一个新的字符串对象。例如,如果我将trim()
应用于当前字符串对象,那么它将创建新对象。所以我的问题是旧的字符串对象会发生什么。是否从堆中删除替换为新对象,或者在其他情况下,如果我执行大量字符串函数,它将继续创建字符串垃圾。请澄清一下?
答案 0 :(得分:1)
是否从堆中删除替换为新对象,或者在其他情况下,如果我执行大量字符串函数,它将继续创建字符串垃圾。
永远没有任何对象"取代"堆上的另一个对象。它们都是在新的位置创建的。任何碰巧仍然参考" old"对象可以继续使用它。
所以,是的,你将生产"字符串垃圾"。但是你有垃圾收集器来处理它:它在后台删除未使用的对象(回收它们的内存以供将来的对象重用)。如果您恰好在紧密循环中执行了大量字符串操作,请考虑使用StringBuilder
或char[]
。这些存在正是为了避免创建大量中间对象的开销。
答案 1 :(得分:1)
你似乎有一种误解。当您调用字符串操作时,会发生一个带有该操作结果的新字符串。旧字符串没有任何反应。
例如
String strWithSpaces = " Dog ";
String strWithoutSpaces = strWithSpaces.trim();
现在你有两个单独的字符串。一个在“Dog”之前和之后有空格的,而一个没有空格。
你可能会问,如果我这样做会发生什么
String strWithSpaces = " Dog ";
strWithSpaces.trim();
嗯,从某种意义上说,这会创建一个没有“Dog”之前和之后的空格的新字符串,但是新字符串没有分配给任何东西,所以它立即有资格进行垃圾收集,旧字符串,空格,保持原样。
如果我这样做
String strWithSpaces = " Dog ";
strWithSpaces = strWithSpaces.trim();
同样,有两个字符串。但现在,新字符串被赋予与旧字符串相同的变量。所以你有一个新的引用,你可以使用它,但你没有直接引用旧的。如果它不是从文字字符串创建的,那么它将被垃圾收集。