2014-10-19 60 views
3

我想刪除我在一個ArrayList創建的對象創建的對象:刪除在一個ArrayList在一個循環的Java

turtles.add(new Turtle()); 

我想ArrayList中擺脫過去的烏龜,像這樣:

turtles.get(turtles.size() - 1) = null; 

任何想法?簡單地從列表中刪除不起作用,Java不會讓我以上述方式取消。我很確定只有一個給定的Turtle對象的唯一引用,因爲它們只是以這種方式創建的。

P.S:海龜類是一個線程,以防萬一。

+0

有沒有辦法來「消滅」的對象。你想達到什麼目的? – SLaks 2014-10-19 02:31:55

+0

是對正在運行的線程的引用,並且您試圖讓線程停止執行? – 2014-10-19 02:44:09

+0

我不再想要該對象存在。基本上只是希望它被垃圾收集。我想我回答我自己的問題,見下文。 – JEJoll 2014-10-19 02:54:12

回答

2

JVM垃圾收集器自動釋放與當沒有剩餘的引用的對象相關聯的存儲器。

在這種情況下,從列表中刪除它將工作得很好,除非您保留對該對象的另一個引用。

如果您已將此線程傳遞給要運行的ExecutorService(或稱爲start方法),那麼在run方法結束之前它不會被銷燬。如果是這種情況,並且您想立即停止線程,則有多種方法可以打破run方法。

+0

是的,我稱之爲啓動方法。它被設置爲運行很多次(我認爲是200000)。給它一個布爾標誌來檢查它每次運行的時候,並且當我想擺脫這個對象並且將它從列表中移除時將其設置爲false。 – JEJoll 2014-10-28 21:47:07

1

只需使用ArrayList.remove(int)一樣,

turtles.remove(turtles.size() - 1); 

您使用turtles創建單獨的實例並不重要,當一個實例不再方法可訪問它有資格進行垃圾收集。

1

當您使用=運算符時,將評估rvalue,然後將其分配給lvalue
但是在你的代碼中,你期望lvalue被評估,這是不可能的。這就是爲什麼你會收到錯誤。
ArrayList通過自己的方法從列表中刪除一個對象。

turtles.remove(turtles.size() - 1);

1

在JAVA中,只有創建對象在我們手中,銷燬它們是由垃圾收集器(GC)決定的。

當您執行該行turtles.add(new Turtle())時,JVM將在Java HEAP中創建一個新的Turtle對象,並將相應的引用添加到列表中。

同樣,當你執行turtles.get(turtles.size() - 1)== null,你基本上是獲得對該對象的引用並使引用爲null。你實際上並沒有刪除這個對象。只有GC負責刪除對象。

請注意,GC是一個較低優先級的線程,我們沒有任何控制權讓它啓動。但是我們可以請求GC使用System.gc()啓動。

1

感謝大家的幫助。

我試着只用

turtles.remove(turtles.size() -1); 

,雖然它從列表中刪除它,我可以告訴大家,線程仍在運行,因爲它仍然產生輸出。我很確定問題實際上是它正在運行(記得Turtle是一個線程),並且在完成之前不會死亡。我想我通過給線程每次運行被調用時,它會檢查一個的IsAlive布爾值,並將其設置爲false,然後從列表中刪除它解決了這個問題,當我想刪除它:

turtles.get(turtles.size() - 1).selfDestruct(); 
turtles.remove(turtles.size() - 1); 

其中自毀這是否:

isAlive = false; 

我很確定這工作,我沒有看到perfmon泄漏。

+1

這正是我在回答中所描述的。 – Justin 2014-10-19 03:33:46

+0

是的,你說得對。在別處研究之前,我沒有仔細閱讀你的答案,錯過了關鍵部分。我已經投票並接受它作爲最佳答案。 – JEJoll 2014-10-28 21:44:03

0

如果你正試圖摧毀Java中的對象,你只需要設置null

object = null; 
+0

試過了。 Java想要一個命名對象來執行此操作:'someTurtle = null;',但是因爲我的對象是在列表中創建的,所以它沒有名稱,訪問它的唯一方法是使用ArrayList的'.get()' ,這不起作用:'turtleList.get(turtleList.size() - 1)= null'。 Java不喜歡這一點,我只是得到錯誤消息,左側的任務必須是一個變量。 – JEJoll 2014-10-19 03:01:14

+0

你看過這個問題嗎?目標是將其從列表中移除 – Victor2748 2014-10-19 03:06:40