Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为ArrayList java的一部分的对象设置null_Java_Collections_Iterator - Fatal编程技术网

为ArrayList java的一部分的对象设置null

为ArrayList java的一部分的对象设置null,java,collections,iterator,Java,Collections,Iterator,我有一个数组列表: private ArrayList<PerfStatBean> statFilterResults; 它不会执行此任务,因为perfBean引用将为null,但对象仍将在内存中 有什么想法吗 谢谢 Tam在循环之前创建一个集合,然后将要删除的任何项目添加到该集合中。循环结束后,调用 statFilterResults.removeAll(beansToDelete); 另外,顺便说一下,我发现使用foreach循环而不是迭代器通常更容易——更可读、更易于维护,

我有一个数组列表:

private ArrayList<PerfStatBean> statFilterResults;
它不会执行此任务,因为perfBean引用将为null,但对象仍将在内存中

有什么想法吗

谢谢


Tam

在循环之前创建一个集合,然后将要删除的任何项目添加到该集合中。循环结束后,调用

statFilterResults.removeAll(beansToDelete);
另外,顺便说一下,我发现使用foreach循环而不是迭代器通常更容易——更可读、更易于维护,等等。在您的情况下,这看起来像:

for (PerfStatBean bean : statFilterResults) {
    ...
}
this.bean = new PerfStatBean();

....

arrayList.add( this.bean );

ListIterator statsIterator=statFilterResults.iterator();
while(statIterator.hasNext()){
i++;
PerfStatBean perfBean=stat迭代器.next();
...
statsIterator.remove();
}

在java中,您实际上不需要费心删除对象。如果下次运行垃圾回收器时没有对对象的引用,它将被删除(当有空闲cpu周期时,GC将运行)。如果希望确保直接删除对象,请使用Runtime.getRuntime().gc()

这可能不是一个很好的优化。如果内存需求很大,那么首先您可能不想将它们全部存储在一个列表中—在创建对象时对其进行处理

但是,从字面上看,
ListIterator.set
是适合您的方法

for (
    ListIterator<PerfStatBean> iter = statFilterResults.listIterator();
    iter.hasNext()
) {
    ++i;
    PerfStatBean perfBean = iter.next();
    iter.set(null);
    ...
}
用于(
ListIterator iter=statFilterResults.ListIterator();
iter.hasNext()
) {
++一,;
PerfStatBean perfBean=iter.next();
iter.set(空);
...
}

为什么不在迭代列表之后简单地清除它呢

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

statFilterResults.clear();
Iterator statsititerator=statFilterResults.Iterator();
while(statIterator.hasNext()){
i++;
PerfStatBean perfBean=stat迭代器.next();
.........
}
statFilterResults.clear();
…在while循环中运行bean以释放内存后,我想从statFilterResults中删除该bean

如果在arraylist之外还有另一个对象引用,将其设置为null不会有任何区别,该对象的内存只使用一次,在java中,您只能看到引用(或引用值)

因此,如果您有类似以下内容:

for (PerfStatBean bean : statFilterResults) {
    ...
}
this.bean = new PerfStatBean();

....

arrayList.add( this.bean );
从列表中删除它不会有任何区别,因为原始引用仍然存在,并且不会得到gc'ed

如果您在收藏之外没有其他参考资料,即

 arrayList.add( new PerfStatBean() );
那么这就足够了:

while(....){
    .... 
}

arrayList.clear();
因为这将删除对对象的引用,这将使它们符合gc的条件

此外:如果要“帮助”减少对象的引用数,请调用:

while(....){
    .... 
}

arrayList.clear();

应该足够了。

@Tom Hawtin的观点很好,关于set(null)而不是remove的回答很好。很难猜测OP约束是什么。也许statFilterResults应该是一个linkedList;在循环之后可能根本不需要它,并且statFilterResults=null就足够了……为什么ArrayList需要O(n^2)?O(n^2):如果要从ArrayList的中间删除一个元素,必须复制/移动其余的元素。如果你需要经常这样做,考虑一个链接列表。@汤姆:你根据什么理由做出这个断言?简单答案的好处:显然,OP有足够的RAM来保存ARARYLIST(它最初是填充的)。这将使所有内存都可以立即用于垃圾收集,而无需尝试手动调优。对于简单的迭代器.remove(),这是一个错误的答案。如果你回顾一下ArrayList(以及AbstractList和AbstractCollection)的实现,它对性能的影响是双重的。你能解释一下为什么这是O(n^2)吗?O(n^2):如果你想从ArrayList的中间删除一个元素,你必须复制/移动其余的元素。如果你需要经常这样做,考虑一个链接列表。我没有注意到他指定ArrayList.+1作为最佳和明显的答案@汤姆:实际上,这比在集合中抛出Beanstodelet并调用remove all要有效得多,remove all为集合中的每个元素调用contains()和remove()。由于迭代器确切地知道元素在列表中的位置,因此可以直接删除它(无需查找)。最后,一个好的列表实现将优化迭代器的remove(),或removeRange(),以利用实现的细节。@Software Monkey:您无法有效地从ArrayList的中间删除元素(即使您知道位置)。这涉及到复制数组的尾部来移动它。@Thilo:是的,但这假设不是所有的元素都将被删除,在这种情况下,您还是要承担费用;否则,他可以在迭代结束时清除列表。
while(....){
    .... 
}

arrayList.clear();
while(....){
    .... 
}

arrayList.clear();