例如:
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是没有referance的删除对象。
但是
答案 0 :(得分:6)
1)我应该设置“box = null;”从数组中删除它后,在此代码中对象?
没有。这样做是浪费时间。
2)我怎样才能确保对象肯定会从内存中删除?
您无法确定它是否会被删除。但是,如果JVM 需要内存,可以确保将删除无法访问的对象。这就是真正重要的事情。
我知道:在Java中,JVM会在没有引用时删除对象。
这不完全正确。我们可以说如下:
任何活动线程不再可以的对象符合条件用于垃圾回收。 (这与说没有对象的引用不同。)
当垃圾收集器运行时,它通常会回收一些无法访问的对象,但不一定全部回收。
如果对象具有finalize
方法,则该方法可能导致对象避免被回收。
所有这些加起来“将删除”太强大了。此外,删除不会立即发生。
答案 1 :(得分:1)
我应该设置“box = null;”从数组中删除它后,在此代码中对象?
不,没有特别需要这样做,因为只要for循环结束,Box
引用就不再存在具有相同的效果。在使用Java编程时,内存管理不用担心。
如何确保该对象肯定会从JM中删除?
你做不到。当垃圾收集器感到需要时,该对象将被垃圾收集。
答案 2 :(得分:1)
不,你不应该。无论如何,“box”变量不存在于循环之外。
您不能确定某个对象“已删除”,您也不应该关心。在内容无法访问时从内存中删除对象将非常慢,GC更喜欢批量工作并自行保存。