[英]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.