删除在循环Java中的arraylist中创建的对象

时间:2014-10-19 02:29:59

标签: java multithreading memory

我正在尝试删除我在ArrayList中创建的对象:

turtles.add(new Turtle());

我想摆脱ArrayList中的最后一只乌龟,如下所示:

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

有什么想法吗?简单地从列表中删除不起作用,Java不会让我以上述方式无效。我很确定只有一个给定Turtle对象的引用,因为它们只是以这种方式创建的。

P.S:Turtle类是一个线程,如果重要的话。

7 个答案:

答案 0 :(得分:2)

当没有剩余引用时,JVM垃圾收集器会自动释放与对象关联的内存。

在这种情况下,将其从列表中删除将完全正常,除非您保留对该对象的另一个引用。

如果您已将此线程传递给要运行的ExecutorService(或称为start方法),那么在run方法完成之后它才会被销毁。如果是这种情况并且您想立即停止该线程,则有多种方法可以突破run方法。

答案 1 :(得分:1)

使用:

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

,因为:

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

不起作用,因为您只能为变量赋值

方法.remove(int)从具有指定ID的ArrayList中删除对象。 这是一个'描述' .remove()方法:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#remove%28int%29

答案 2 :(得分:1)

只需使用ArrayList.remove(int)之类的,

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

用于在turtles中创建单个实例的方法无关紧要,当实例不再可访问时,它有资格进行垃圾回收。

答案 3 :(得分:1)

当您使用=运算符时,会对rvalue进行评估,然后将其分配给lvalue
但是在您的代码中,您期望评估lvalue,这是不可能的。这就是你收到错误的原因 ArrayList提供了自己的方法来从列表中删除对象。

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

答案 4 :(得分:1)

在JAVA中,只有对象的创建在我们手中,销毁它们由垃圾收集器(GC)决定。

执行 turtles.add(new Turtle())行时,JVM会在java HEAP中创建一个新的Turtle对象,并将相应的引用添加到list。

类似地,当您执行 turtles.get(turtles.size() - 1)== null 时,您实际上是获取对该对象的引用并使引用为null。您实际上并没有删除该对象。只有GC负责删除对象。

请注意,GC是一个优先级较低的线程,我们没有任何控制权来启动它。但我们可以使用System.gc()请求GC启动。

答案 5 :(得分:1)

感谢大家的帮助。

我尝试过使用

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

当它从列表中删除它时,我可以告诉该线程仍在运行,因为它仍在生成输出。我很确定问题实际上是它正在运行(记住Turtle是一个线程),并且在它完成之前不会死。我想我通过给线程一个isAlive布尔值解决了这个问题,它每次调用run都会检查它,并将它设置为false,然后当我想删除它时将它从列表中删除:

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

其中selfDestruct执行此操作:

isAlive = false;

我很确定这有效,我没有看到perfmon的任何泄漏。

答案 6 :(得分:0)

如果您尝试使用Java销毁对象,则只需将其设置为null

object = null;