2013-03-27 195 views
2

假設我正在刪除名爲「Enemy」的「死」對象。Java,確保從arrayList中刪除對象時正在刪除對象

使用這樣的事情:

for(int i = 0; i < enemies.size(); i++) 
    { 
    Enemy en = (Enemy) enemies.get(i); 
    if(en.getVisible() == true) 
     en.update(); 
    else 
     enemies.remove(i); 
    } 

是否得到對象從ArrayList中被移除之後刪除?還是「應該」呢?我一直主要在做C++代碼,垃圾收集令我困惑。

任何方式我可以看到對象是否被垃圾收集器刪除或不是?

感謝

+0

在java中,您不必擔心這些情況。垃圾收集器照顧這個。 – 2013-03-27 05:41:23

+1

不,他們不會被刪除,你會得到'ConcurrentModificationException' :) – 2013-03-27 05:42:14

+0

是的。我就是這麼說的。 Thanks @ denis.solonenko ...梅森你甚至運行過這段代碼嗎? – SRy 2013-03-27 05:42:47

回答

1

我真的很喜歡看到整個垃圾收集慘敗的對面,C/C++和Java。 Java有它自己的垃圾收集器,你不需要擔心內存管理 - .remove()就足夠了。

+1

不是真的,如果你在其他一些集合中保留對敵方對象的引用,例如忘記清除它,你仍然可以在Java中泄漏內存 – 2013-03-27 05:43:45

+2

@ denis.solonenko確實如此,但是如果你保留對它的引用而沒有任何意圖使用它,那只是不好的做法。你可以在Java中使用內存泄漏,但這很少見,當然不像C那樣容易。 – RyPope 2013-03-27 05:46:11

+0

一方面它很酷,但我希望有一種更簡單的方法可以在我不需要時調用垃圾收集器來清理對象它再一次。我想知道他們爲什麼沒有添加類似於刪除的關鍵字,而是「更安全」。 – DMB 2013-03-27 06:22:03

1

如果您從ArrayList中刪除一個對象,並且該對象沒有任何其他引用,那麼這對垃圾收集器來說是'符合條件的。之後,您不必擔心將其從堆中移除:JVM會通過自動垃圾回收器來完成此操作。

0

我認爲這取決於你如何輸入對象。如果你將它保存在其他地方,它應該仍然存在,但是如果你直接將它添加到arrayList,它可能是垃圾。

P.S.你的代碼需要更正

enemies.remove(i); 
enemies.remove(i--); 
0

把我的意見關於ConcurrentModificationException回來。你不會得到它,但你的循環仍然不正確。請看:

List<String> list = new ArrayList<String>(Arrays.asList("A","B","C","D")); 
for (int i = 0; i < list.size(); i++) { 
    String s = list.get(i); 
    if ("B".equals(s) || "C".equals(s)) list.remove(i); 
} 
System.out.println(list); 

輸出:

[A, C, D] 

C不刪除,由於i一直增加,跳躍的元素。

0

大多數情況下,您不需要擔心Java中的顯式內存管理 - 只要從列表中刪除後沒有其他對象引用它們,垃圾收集器將(最終)將它們刪除。

如果enemies列表中的對象持有某些系統資源或其他需要顯式處理的內容(例如文件句柄或其他內容),則在丟失引用之前,您需要清除它:

Enemy enemy = enemies.remove(); 
enemy.dispose(); // this is your method to clean up the internals - name it what you want 
// continue your loop here 

在與您的示例代碼的說明,你要在索引使用Iterator,而不僅僅是一個for循環迭代這樣你就可以remove不正常運行到圍繞當前指數和列表大小的問題。您可能還需要考慮不同的List實現(如LinkedList,如插入/從ArrayList中間除去可以得到昂貴,如果是大

對於你的另一個問題:

無論如何,我可以看到垃圾收集器是否正在刪除對象?

你可能override the finalize method你的班級 - be careful當你這樣做,雖然。另外請注意,有no guarantees時,您的對象將被垃圾收集 - 不同的JVM經常管理內存略有不同,並且往往只需要垃圾收集時,它需要更多的內存。