nullify对象是ArrayList java的一部分

时间:2009-07-13 23:03:31

标签: java collections iterator

我有一个数组列表:

private ArrayList<PerfStatBean> statFilterResults;

我想迭代它:

Iterator<PerfStatBean> statsIterator = statFilterResults.iterator();
while(statsIterator.hasNext()){
  i++;
  PerfStatBean perfBean = statsIterator.next();
  .........

我想在while循环中运行它以释放内存后,从statFilterResults中删除bean。我相信如果我做了像

这样的事情
 perfBean = null;

它不会完成这项工作,因为perfBean引用将为null,但该对象仍将在内存中。

有什么想法吗?

谢谢,

9 个答案:

答案 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();

应该够了。