2012-11-10 26 views
7

我剖析我的Android遊戲,驚訝地發現:列表迭代器會導致堆分配?

for(O o : myArrayList) 
{ 
} 

創建一組堆分配的。

除了使用數字i++ for循環,有沒有更好的方法來解決這個問題?我可以預先分配我的迭代器或其他東西嗎?

+0

不,沒有性能損失。 採取在此[響應]看看[1] [1]:http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a爲循環和爲每個循環 –

+1

我不關心性能,我只是想避免垃圾收集器在我的遊戲。 – jmasterx

回答

4

這個循環,

 for(O o : myArrayList) 
    { 
    } 

被轉換爲:

 for(Iterator<O> iter = myArrayList.iterator(); iter.hasNext();) 
    { 
     O o = iter.next(); 
    } 

所以迭代器的對象將會得到在堆中分配,如果你使用這種模式。

如果你寫這樣的:

 O o = null; 
    for(Iterator<O> iter = myArrayList.iterator(); iter.hasNext();) 
    { 
     o = iter.next(); 
    } 

O o = null; 
    Iterator<O> iter = myArrayList.iterator(); 
    while(iter.hasNext()){ 
     o = iter.next(); 
    } 

那麼我認爲不會有太大作爲其只涉及現有的對象引用的分配迭代GC參與。

+0

這是否仍然會導致GC被調用得比應該多得多?這是我想要阻止的。 – jmasterx

+0

我認爲如果你在循環外面聲明'O o;',每次它只會改變列表中元素的引用,這應該會更好。 –

+1

這些對象(循環迭代器)很可能只存在於託兒所中,並且永遠不會貢獻給主要的GC收集。 –