如果我创建了一个arraylist,然后使用add()
方法在其中创建对象,当我使用iterator.remove()
方法时,它只是从数组中删除它们还是删除它们?
数组中的对象在被删除时是否被删除(或者至少被垃圾收集器标记为删除),或者当你从数组中拉出它们并且没有任何方法时,它们是否在程序的持续时间内处于不确定状态访问它们?
我考虑将要删除的索引处的数组设置为null但是如果它只是访问数组而不是对象本身,那么它将使用null替换对象并将引用抛入limbo而不删除对象本身。
答案 0 :(得分:2)
您不能直接“删除”Java中的对象 - 垃圾收集器负责所有这些工作。从ArrayList
删除项目只会从ArrayList
删除对该项目的引用 - 仅此而已。对象可能会保留在堆中,用于程序的其余部分,也可能会立即收集;它取决于程序中还有什么,以及垃圾收集器是否认为它应该释放一些空间。
实际上,自动删除对象可能是一个糟糕的选择,因为可能存在对该对象的一些其他引用,这些引用将被自动删除无效。
对于常规数组,将索引处的引用设置为null
(和/或移动其他元素)是从对象数组中“移除”对象的标准方法。如果你没有这样做,你应该在它应该被释放后继续引用它,导致潜在的内存泄漏。
答案 1 :(得分:1)
垃圾收集的工作方式是,只要堆上的对象在堆栈上没有指针,就您或程序而言,它将被删除。
因此,只要删除(),对象就没有与之关联的指针,并且作为一个整体被删除(这是过于简化的,因为垃圾收集比这更复杂,但就你而言有关,它已经消失了。)
它不是访问对象,而是删除指向存储在该arraylist索引中的对象的指针。 remove()或类似方法不会删除对象,而是由垃圾收集器删除。
现在,如果您要存储对该对象的不同引用(例如,int a = array_list [0]),然后从该数组中删除该对象,则不会对其进行垃圾回收。它根本不会在数组中有一个指针,但仍会引用该对象。
答案 2 :(得分:0)
如果您的集合是该对象的唯一链接,那么,当从您的集合中删除该对象时,它最终将被垃圾收集。垃圾收集器甚至是一个系统,你不能强迫它。