簡體   English   中英

nullify對象是ArrayList java的一部分

[英]nullify object that is part of ArrayList java

我有一個數組列表:

private ArrayList<PerfStatBean> statFilterResults;

我想迭代它,如:

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

在while循環中運行它以釋放內存后,我想從statFilterResults中刪除bean。 我相信如果我這樣做的話

 perfBean = null;

它不會完成這項工作,因為perfBean引用將為null,但該對象仍將在內存中。

有任何想法嗎?

謝謝,

這可能不是一個很好的優化。 如果內存需求很大,那么您可能不希望將它們全部存儲在列表中 - 在創建對象時處理它們。

但是,從字面上ListIterator.set問題, ListIterator.set是適合您的方法。

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

為什么不在迭代后清除列表?

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

statFilterResults.clear();

在循環之前創建一個集,然后將要刪除的任何項添加到該集。 循環后,調用

statFilterResults.removeAll(beansToDelete);

而且,順便說一句,我發現它通常更容易 - 更易讀,更易於維護等 - 使用foreach循環而不是迭代器。 在您的情況下,這看起來像:

for (PerfStatBean bean : statFilterResults) {
    ...
}
ListIterator<PerfStatBean> statsIterator = statFilterResults.iterator();
while(statsIterator.hasNext()){
  i++;
  PerfStatBean perfBean = statsIterator.next();
  ...
  statsIterator.remove();
}
while(statsIterator.hasNext()){
  i++;
  PerfStatBean perfBean = statsIterator.next();
  statsIterator.remove();

在java中,你真的不需要打擾刪除對象。 如果下次垃圾收集器運行時沒有對象的引用,它將被刪除(當有無cpu周期時運行GC)。 如果您希望確保直接刪除該對象,請使用Runtime.getRuntime()。gc()

...我希望在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();

應該夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM