Java Setter中的GC

Java Setter中的GC,java,garbage-collection,setter,Java,Garbage Collection,Setter,在Java setter方法中,将新对象分配给字段,例如: public class MyClass { private String s; public void mySetter(String newS) { s = newS; } } 调用mySetter后是否会对前面的字符串s进行垃圾收集,或者在将其分配给新值之前是否应该将s清空 public class MyClass { private String s; pu

在Java setter方法中,将新对象分配给字段,例如:

public class MyClass
{
     private String s;
     public void mySetter(String newS) {
          s = newS;
     }
}
调用mySetter后是否会对前面的字符串s进行垃圾收集,或者在将其分配给新值之前是否应该将s清空

public class MyClass
{
     private String s;
     public void mySetter(String newS) {
          s = null;
          s = newS;
     }
}

只有当JVM需要内存空间时,才会发生垃圾收集

因此,在您的情况下,一旦调用您的方法,它就不会被垃圾收集

更多的问题已经有了答案


另外,在将字符串赋给另一个值时,不需要先将其设置为null,当您将一个新值赋给string时,意味着现在您的引用变量不是指向
string
对象的前一个值,而是指向新值,
Java
为您提供了一种灵活性,使您不必像其他编程语言一样担心GC。因此,不要尝试执行GC,
Java
可以为您处理它

无需空值,如果没有其他人引用该字符串,垃圾收集器将找到该字符串

调用mySetter后是否会对前面的字符串s进行垃圾收集,或者在将其分配给新值之前是否应该将s清空

public class MyClass
{
     private String s;
     public void mySetter(String newS) {
          s = null;
          s = newS;
     }
}

如果您以前的
字符串s
未在任何地方引用,则它将被引用。但是在调用
mySetter
之后,它不会立即发生。无需将其设置为
null

您不必执行
s=null零件。在Java中,变量实际上是对RAM内存中物理对象的引用。所以当你做
s=newS
使变量
s
指向RAM中的新对象,旧对象不再被任何变量引用,将被垃圾收集

你能提供一个来源来支持你的陈述吗?这是垃圾收集的本质。您可以通过重写对象的
finalize()
方法来测试这一点。此方法是在垃圾收集对象之前调用的。似乎我不需要将其置空,但我非常希望引用(如JLS)来支持这些声明。在大多数(所有?)情况下,将变量设置为某个值并立即将其设置为其他值是没有用的。哦,现在我看到你的编辑了。在ArrayList中插入另一个对象之前,position元素[--size]将在那里闲置一段时间,因此需要使用它。例如,如果用户在应用程序中按下一个按钮,它可以为MyClass设置一个新的字符串。@marcus我收回了那个编辑,因为我意识到我的代码和ArrayList的代码不同