1

例如:

public class Box{
    public int id;

    public Box(int id){
        this.id = id;
    }
}

ArrayList<Box> boxArray = new ArrayList<Box>();

boxArray.add(new Box(0));
boxArray.add(new Box(1));
boxArray.add(new Box(2));

for (Iterator<Box> iter = boxArray.iterator(); iter.hasNext();) {
    Box box = iter.next();

    if (box.id == 1) {
        iter.remove();
        box = null;
    }
}

我知道:在 Java 中,JM 在没有引用时是删除对象。

  1. 我应该设置“box = null;” 在从数组中删除它之后是否在此代码中反对?
  2. 我如何确保该对象肯定会从 JM 中删除?
4

3 回答 3

6

1)我应该设置“box = null;” 在从数组中删除它之后是否在此代码中反对?

不,这样做是浪费时间。

2)我如何确保该对象肯定会从内存中删除?

你不能确定它会被删除。但是,如果 JVM需要内存,您可以确定将删除无法访问的对象。这才是真正重要的。


我知道:在 Java 中,JVM 会在没有引用对象时删除它。

这并不完全正确。我们可以说如下:

  • 任何活动线程都无法访问的对象有资格进行垃圾回收。(这与说没有对对象的引用不同。)

  • 当垃圾收集器运行时,它通常会回收一些无法访问的对象,但不一定是全部。

  • 如果对象具有finalize方法,则该方法可能导致对象避免被回收。

所有这些加起来就是“将删除”太强了。此外,删除不会立即发生。

于 2013-10-05T14:48:45.320 回答
1

我应该设置“box = null;” 在从数组中删除它之后是否在此代码中反对?

不,没有特别需要这样做,因为一旦 for 循环结束,Box引用就不再存在,具有相同的效果。使用 Java 编程时,内存管理是一件不用担心的事情。

我如何确保该对象肯定会从 JM 中删除?

你不能。当垃圾收集器认为需要时,该对象将被垃圾收集。

于 2013-10-05T14:49:41.803 回答
1
  1. 不,你不应该。无论如何,“box”变量不存在于您的循环之外。

  2. 您不能确定某个对象“已被移除”,也不应在意。在无法访问的时候从内存中删除对象会非常慢,GC 更喜欢分批工作并自己记账。

于 2013-10-05T14:49:54.217 回答