我正在尝试删除我在ArrayList中创建的对象:
turtles.add(new Turtle());
我想摆脱ArrayList中的最后一只乌龟,如下所示:
turtles.get(turtles.size() - 1) = null;
有什么想法吗?简单地从列表中删除不起作用,Java不会让我以上述方式无效。我很确定只有一个给定Turtle对象的引用,因为它们只是以这种方式创建的。
P.S:Turtle类是一个线程,如果重要的话。
答案 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;