我有一个数组列表:
private ArrayList<PerfStatBean> statFilterResults;
我想迭代它:
Iterator<PerfStatBean> statsIterator = statFilterResults.iterator();
while(statsIterator.hasNext()){
i++;
PerfStatBean perfBean = statsIterator.next();
.........
我想在while循环中运行它以释放内存后,从statFilterResults中删除bean。我相信如果我做了像
这样的事情 perfBean = null;
它不会完成这项工作,因为perfBean引用将为null,但该对象仍将在内存中。
有什么想法吗?
谢谢,
担
答案 0 :(得分:3)
这可能不是一个很好的优化。如果内存需求很大,那么您可能不希望将它们全部存储在列表中 - 在创建对象时处理它们。
但是,从字面上理解问题,ListIterator.set
就是您的方法。
for (
ListIterator<PerfStatBean> iter = statFilterResults.listIterator();
iter.hasNext()
) {
++i;
PerfStatBean perfBean = iter.next();
iter.set(null);
...
}
答案 1 :(得分:2)
答案 2 :(得分:2)
为什么不在迭代后清除列表呢?
Iterator<PerfStatBean> statsIterator = statFilterResults.iterator();
while(statsIterator.hasNext()){
i++;
PerfStatBean perfBean = statsIterator.next();
.........
}
statFilterResults.clear();
答案 3 :(得分:1)
在循环之前创建一个集合,然后将要删除的任何项目添加到该集合中。循环之后,调用
statFilterResults.removeAll(beansToDelete);
另外,顺便说一句,我发现它通常更容易 - 更易读,更易于维护等 - 使用foreach循环而不是迭代器。在您的情况下,这看起来像:
for (PerfStatBean bean : statFilterResults) {
...
}
答案 4 :(得分:1)
ListIterator<PerfStatBean> statsIterator = statFilterResults.iterator();
while(statsIterator.hasNext()){
i++;
PerfStatBean perfBean = statsIterator.next();
...
statsIterator.remove();
}
答案 5 :(得分:1)
while(statsIterator.hasNext()){
i++;
PerfStatBean perfBean = statsIterator.next();
statsIterator.remove();
答案 6 :(得分:0)
在java中,你真的不需要为删除对象而烦恼。如果下次垃圾收集器运行时没有对象的引用,它将被删除(当有无cpu周期时运行GC)。如果您希望确保直接删除该对象,请使用Runtime.getRuntime()。gc()
答案 7 :(得分:0)
我认为其他答案已经提到了这个答案的部分内容,但是......
来自API:
Object的finalize()方法是 “被垃圾收集者叫到了 垃圾收集时的对象 确定没有更多 引用对象“。
“完成方法之后 为一个对象调用,没有进一步 采取行动直到Java虚拟 机器再次确定了 不再有任何手段 这个对象可以被任何人访问 尚未死亡的帖子, 包括其他人的可能行动 准备好的对象或类 最后确定,在这一点上 对象可能会被丢弃。“
所以基本上,一旦没有指针就会丢弃bean。所以在你的循环中,你想确保ArrayList删除它指向bean的指针(这可以通过在循环中的迭代器上调用remove()来完成)。
答案 8 :(得分:0)
...我希望在while循环中运行它之后从statFilterResults中删除bean以释放内存。
如果在arraylist外面有另一个对象引用,将它设置为null将没有任何区别,该对象的内存只使用一次,而在java中你只看到引用(或引用值)
所以如果你有类似的东西:
this.bean = new PerfStatBean();
....
arrayList.add( this.bean );
从列表中删除它不会有任何区别,因为原始引用仍然存在并且不会获得gc'ed。
如果您在集合外没有其他参考资料,即
arrayList.add( new PerfStatBean() );
那么这应该足够了:
while(....){
....
}
arrayList.clear();
因为那将删除对象的引用,这将使它们符合gc的条件。
此外:如果您想“帮助”减少对象具有的引用数量,请调用:
while(....){
....
}
arrayList.clear();
应该够了。