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

问题描述 投票:0回答:2

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

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

每个粒子都是一个Blob类对象。 Blob对象包含称为lespoints的VectorsList和其数据中的int id。

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

 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++;
   }
   }
java processing
2个回答
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

4
投票

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

例如:

String x = "test";
x = null;

此时,值"test"可以被垃圾收集,因为没有任何指向它。

与此相比:

String x = "test";
ArrayList<String> list = new ArrayList<>();
list.add(x);
x = null;

在这一点上,qazxsw poi的值不能被垃圾收集,因为qazxsw poi仍然指向它。

但如果你这样做:

"test"

然后它可能是垃圾收集。

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

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

无耻的自我推销:list.remove("test"); 是ArrayLists的教程,包括从中删除元素。

© www.soinside.com 2019 - 2024. All rights reserved.