我正在研究布朗运动跟踪的处理程序。
我有一个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++;
}
}
答案 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