这会像析构函数一样工作吗?

时间:2018-06-12 22:59:41

标签: java processing

我正在研究布朗运动跟踪的处理程序。

我有一个ArrayList blobs和ArrayList tomerge。第一个是我跟踪的粒子列表,第二个是我要合并的粒子列表。

每个粒子都是Blob类对象。 Blob对象计算了在其数据中称为lespoints和int id的Vectors的ArrayList。

由于我需要将一些粒子合并为一个,我需要销毁一些Blob对象,但Java没有任何析构函数,我也不想使用finalize()。这会像merge + destruction一样工作吗?

 public void delete(Blob a)
 {
   a = null;
 }

   void merge(ArrayList<Blob> tomerge)
   {

    int i = 0;
    int j = 0;

   while (i <= tomerge.size())
   {
     Blob k = new Blob();
       k = tomerge.get(i);
     while (j <= tomerge.get(i).siz()) {
       Vector g = k.lespoints.get(j);
      lespoints.add(g);
      j++;
     }
     if (i > 0)
     {
       delete(tomerge.get(i));
     }
     i++;
   }
   }

2 个答案:

答案 0 :(得分:4)

您无需手动执行任何操作。只要确保你没有任何你想要消失的变量的引用,Java将处理其余的。

例如:

"test"

此时,值String x = "test"; ArrayList<String> list = new ArrayList<>(); list.add(x); x = null; 可以被垃圾收集,因为没有任何内容指向它。

将其与此相比:

"test"

此时,无法收集值ArrayList,因为list.remove("test"); 仍然指向它。

但如果你这样做了:

ArrayList

然后它可能被垃圾收集。

基本上,您需要做的就是从{{1}}中删除元素,Java将负责其余部分。请注意,您可能不希望在当前循环中执行此操作,因为在迭代列表时删除元素可能会导致跳过元素。

相反,您可能希望使用迭代器或仅向后循环ArrayList。

无耻的自我推销:here是关于ArrayLists的教程,包括从中删除元素。

答案 1 :(得分:0)

您的代码示例无法正常工作。

public void delete(Blob a)
{
    a = null;
}

Blob b = new Blob();
delete(b);

在此代码示例中,设置为null引用a,而不是b

您没有删除Blob对象,而是将参考设置为null

调用delete()方法时,存在2个对Blob的引用。

一个引用是b,它位于调用代码中。

另一个引用是a,它位于被调用的代码中。

a设置为null,然后退出该方法。但b引用始终存在。因此,Blob永远不会被垃圾收集。

要实现垃圾收集,您必须删除对象的所有引用;然后它在JVM的便利性上被破坏了。

用于在迭代期间删除对象的Java Collections API的工作方式如下:

Iterator<Blob> itr = list.iterator();
while( itr.hasNext() ) {
    Blob b = itr.next();
    if( /* test condition */ ) {
        itr.remove();  // Safely removes object from List during iteration
    }
} // Object `b` goes out of scope, and so this Blob is "lost" to the the code and is going to be destroyed