我正在研究布朗运动跟踪的处理程序。
我有一个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++;
}
}
您的代码示例无法正常工作的确切原因。
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
您无需手动执行任何操作。只要确保你没有任何你想要消失的变量的引用,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的教程,包括从中删除元素。