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

删除在Java循环中的arraylist中创建的对象,java,multithreading,memory,Java,Multithreading,Memory,我正在尝试删除在ArrayList中创建的对象: turtles.add(new Turtle()); 我想除掉ArrayList中的最后一只海龟,类似这样: turtles.get(turtles.size() - 1) = null; 有什么想法吗?简单地从列表中删除是行不通的,Java也不会让我以上述方式将其置为空。我很确定,对于给定的海龟对象只有一个引用,因为它们是以这种方式创建的 附言:海龟类是一个线程,以防出现问题。使用: turtles.remove(turtles.size(

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

turtles.add(new Turtle());
我想除掉ArrayList中的最后一只海龟,类似这样:

turtles.get(turtles.size() - 1) = null;
有什么想法吗?简单地从列表中删除是行不通的,Java也不会让我以上述方式将其置为空。我很确定,对于给定的海龟对象只有一个引用,因为它们是以这种方式创建的

附言:海龟类是一个线程,以防出现问题。

使用:

turtles.remove(turtles.size() -1 );
因为:

turtles.get(turtles.size() - 1) = null;
将不起作用,因为您只能为变量赋值

方法
.remove(int)
使用指定的id从
ArrayList
中删除对象。 下面是
.remove()
方法的“描述”:

只需使用like


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

当您使用
=
运算符时,将对
右值进行求值,然后将其分配给
左值
但是在您的代码中,您希望计算
左值
,这是不可能的。这就是为什么会出现错误。
ArrayList
为从列表中删除对象提供了自己的方法


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

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

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


如果已将此线程传递给要运行的
ExecutorService
(或调用
start
方法),则在
run
方法完成之前,它不会被销毁。如果是这种情况,并且您希望立即停止线程,那么有多种方法可以打破
运行
方法。

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

当执行行turtles.add(new-Turtle())时,JVM在java堆中创建一个新的Turtle对象,并将相应的引用添加到列表中

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


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

感谢大家的帮助

我试着用它

turtles.remove(turtles.size() -1 );
当它从列表中删除它时,我可以看出线程仍在运行,因为它仍在生成输出。我很确定问题实际上是它正在运行(记住海龟是一根线),并且在完成之前不会死。我想我解决了这个问题,我给了线程一个isAlive布尔值,它在每次调用run时都会进行检查,并将其设置为false,然后在我想删除它时将其从列表中删除:

turtles.get(turtles.size() - 1).selfDestruct();
turtles.remove(turtles.size() - 1);
自毁程序执行此操作时:

isAlive = false;

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

如果您试图销毁Java中的对象,只需将其设置为
null

object = null;

没有办法“摧毁”一个物体。您试图完成什么?是对正在运行的线程的引用,并且您试图使线程停止执行?我不再希望对象存在。基本上只是想把它垃圾收集起来。我想我回答了我自己的问题,见下文。试过了。Java需要一个命名对象来实现这一点:
someturl=null,但因为我的对象是在列表中创建的,所以它没有名称,访问它的唯一方法是使用ArrayList的
.get()
,这不起作用:
turtleList.get(turtleList.size()-1)=null
。Java不喜欢这样,我只是得到一条错误消息,赋值的左边必须是一个变量。你读过这个问题了吗?我们的目标是将其从列表中删除这正是我在回答中所描述的。是的,你是对的。我没有仔细阅读你的答案,在其他地方进行更多研究之前,错过了关键部分。我投票通过了它,并接受它作为最佳答案。是的,我调用了start方法。它被设定运行了很多次(我想是200000次)。每次运行时都给它一个布尔标志来检查,当我想要删除对象并将其从列表中删除时,将该标志设置为false是有效的。
object = null;