如果我让字符串引用转义,这会阻止包含对象被垃圾收集吗?

时间:2012-09-01 20:13:50

标签: java garbage-collection

假设我有一个包含字符串的对象,如下所示:

class SomeObject  {
   private final String s;
   private final int i;

   SomeObject(String s, int i) {
      this.s = s;
      this.i = i;
   }

   String getString() {
      return s;
   }
}

因此,如果我只使用不带SomeObject的引用,例如我用来构建另一个对象而我不需要i和任何其他可能的字段,它是否会被垃圾收集?< / p>

编辑:我很抱歉不清楚。事情就是说我有一个名为someObject的SomeObject实例,如果我让s引用使用getString()方法转义,即someObject.getString()并使用返回引用构建一些其他对象,例如:不是SomeObject实例,someObject可以被垃圾收集吗?

3 个答案:

答案 0 :(得分:2)

我想你是指s?是的,SomeObject的实例可以免费收集垃圾。 String不会引用它所源自的SomeObject

答案 1 :(得分:2)

getString()将返回s,但不会从当前SomeObject“删除”它。如果将值x分配给s

s = x;
如果您将新值x分配给y

s将仅进行垃圾回收

s = y;

并且没有提及x左。

答案 2 :(得分:2)

让我问你这个。

final class Foo {
  String value = "initial";
}

假设您按如下方式执行代码......

final Foo foo = new Foo();
final String val = foo.value;
foo.value = "replaced";

现在,您认为val现在会等于"replaced"吗?希望不是,因为它不会;看来你对参考是什么有一些误解。使用val = foo.value,您将字段foo.value的值复制到val;该值是对"initial"字符串的引用。 是对字段foo.value的引用。坚持"initial"的引用不会阻止foo被垃圾收集。