用Java覆盖引用

时间:2016-03-30 15:34:17

标签: java

在这些代码行之后:

ArrayList arrayList = new ArrayList(2);
arrayList = new ArrayList(5);

会从内存中删除第一个对象吗?

4 个答案:

答案 0 :(得分:3)

是的,它将在下次运行时被垃圾收集器删除。 (假设您在此期间没有将引用分配给另一个变量。)

答案 1 :(得分:1)

第一个对象将是候选GC(垃圾收集器)在其下一个循环中删除,通常不会立即删除。

答案 2 :(得分:1)

ArrayList arrayList = new ArrayList(2);
  

Java有一个对ArrayList(2);

的引用
arrayList = new ArrayList(5);
  

Java没有引用ArrayList(2)
  Java有一个对ArrayList(5)

的引用

当垃圾收集器运行时,它会计算对象所具有的引用。如果没有任何内容引用它,它将被收集和删除。

请注意,如果还有其他引用它的内容,这不适用于存储在ArrayList中的对象。

Foo bar = new Foo('baz');
Foo baz = new Foo('bar');
ArrayList arrayList = new ArrayList(2);
arrayList.add(bar);
arrayList.add(baz);
arrayList = new ArrayList(5);

在这种情况下,ArrayList(2)将被取消设置,但barbaz将不会,因为它们仍有一个引用。您必须将这些设置为null或覆盖其变量,或者它们所在的范围必须已过期。

在这种情况下,它们也会被删除:

public void fill(ArrayList list) {
  Foo bar = new Foo('baz');
  Foo baz = new Foo('bar');   
  arrayList.add(bar);
  arrayList.add(baz);
}

ArrayList arrayList = new ArrayList(2);
this.fill(arrayList);
arrayList = new ArrayList(5);

在这种情况下,由于barbaz已过期的功能以及对这些变量没有更多有效引用,barbaz也是可以收集。

答案 3 :(得分:0)

不,它只是有资格进行垃圾收集。