【问题标题】:Removing/Deleting Object from an arraylist java从arraylist java中删除/删除对象
【发布时间】:2014-06-04 00:04:02
【问题描述】:

如果我创建一个数组列表,然后使用add() 方法在其中创建对象,当我使用iterator.remove() 方法时,它是简单地将它们从数组中删除还是将它们也删除?

当数组中的对象被删除(或至少被垃圾收集器标记为删除)时它们是否被删除,或者当你从数组中拉出它们时它们是否存在于程序的持续时间中并且没有办法访问它们?

我曾考虑将要删除的索引处的数组设置为 null,但如果它只是访问数组而不是对象本身,它将用 null 替换对象并将引用扔到边缘而不删除对象自己。

【问题讨论】:

  • 我认为您不了解 GC 垃圾收集过程的基础知识。没有什么是“删除”的。没有任何东西“标记为 GC”。当您的程序中停止引用时,垃圾收集器会删除内容。
  • 任何存在于边缘的东西都会被垃圾回收。从技术上讲,使用变量将对象分配给名称。当该对象没有名称时,您将无法再使用它。垃圾收集器一直等到对象在任何地方都没有名称。例如,String a = "Hello""Hello" 命名为 a。然后,当您执行a = "World" 时,"Hello" 不再具有名称,因此垃圾收集器将其清理干净。

标签: java arraylist garbage-collection


【解决方案1】:

您不能在 Java 中直接“删除”一个对象——垃圾收集器负责所有这些工作。从ArrayList 中删除一个项目只是从ArrayList 中删除对该项目的引用——仅此而已。该对象可能会在程序的其余部分保留在堆中,或者可能会立即被收集;这取决于程序中还发生了什么以及垃圾收集器是否认为它应该释放一些空间。

事实上,自动删除对象可能是一个糟糕的选择,因为可能存在对该对象的某些其他引用,这些引用会因自动删除而失效。

对于常规数组,将要删除的索引处的引用设置为null(和/或移动其他元素)是从对象数组中“删除”对象的标准方法。如果你不这样做,你会在它应该被释放后持有一个引用,从而导致潜在的内存泄漏。

【讨论】:

  • 你最后一段很混乱。删除的标准方法是调用remove。调用 set(index, null) 会做一些非常不同的事情,而且也很有意义 - 有时。
  • @maaartinus 抱歉,最后一段我指的是常规数组,而不是 ArrayLists,因为 OP 在他/她的最后一段中谈到了这一点。我会说清楚的。
  • 我明白了。现在好了。
【解决方案2】:

垃圾回收的工作方式是,一旦堆上的对象在堆栈上没有指针,就您或程序而言,它就会被删除。

因此,一旦您 remove(),该对象将没有与之关联的指针,并作为一个整体被删除(这过于简单,因为垃圾收集比这更复杂一些,但就您而言担心,它已经消失了)。

它不是访问对象,而是删除指向存储在该数组列表索引处的对象的指针。对象不是由 remove() 或此类方法删除的,而是由垃圾收集器删除的。

现在,如果您要存储对该对象的不同引用(例如,int a = array_list[0]),然后从数组中删除该对象,则它不会被垃圾回收。它根本不会在数组中再有一个指针,但 a 仍然会引用该对象。

【讨论】:

  • 这里使用 as soon as 具有误导性。 GC 是不确定的。它会在感觉喜欢的时候移除东西。
  • 当然,这是真的。这就是为什么我在顶部澄清“就你或程序而言”。对于这个简单的问题,无需深入讨论 GC 的细节。但确实,你是对的。
【解决方案3】:

如果您的集合是该对象的唯一链接,那么当该对象从您的集合中移除时,它最终会被垃圾回收。垃圾收集器甚至是一个系统,你不能强迫它。

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 2010-11-21
    • 2013-01-26
    • 1970-01-01
    • 2013-03-17
    • 2015-08-02
    相关资源
    最近更新 更多