有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java集合中删除对象

我有一个对象的HashMap(尽管我猜这个问题适用于其他集合)。据我所知,当文档谈到删除映射时,它就是从哈希表中删除条目,也就是说,不一定要销毁实际对象。如果该对象的唯一剩余引用在此表中,那么该对象是否会被垃圾回收

如果我执行map.clear()并且表中的那些对象没有在其他任何地方引用,它们会被垃圾收集吗

最快的方法是,从表中删除所有条目,同时销毁这些对象


共 (6) 个答案

  1. # 1 楼答案

    If the only remaining reference to the object is in this table, then will the object get garbage collected?

    如果没有对对象的其他引用,那么该对象将在将来某个时候被垃圾收集

    您不应该强制销毁对象。如果它们是非常重的对象(或者您有太多的对象无法放入内存),这就指向了代码的一个更根本的问题

    如果您确实必须这样做,那么您可以调用System.gc(),尽管这不是一个好的实践,并且始终是代码中潜在问题的前兆

  2. # 2 楼答案

    一般来说,你不能很好地控制一个物体何时被破坏。当没有更多的(强)引用时,任何对象都有资格进行垃圾收集,但不能保证何时对其进行垃圾收集,或者实际上是否会进行垃圾收集。甚至调用System.gc()Runtime.gc()都不能保证实际做任何事情,这只是对JVM的一种暗示,现在它可能想考虑垃圾收集。我相信您得到的唯一保证是,如果抛出OutOfMemoryError,所有可能的垃圾收集都是在抛出错误之前完成的

    这里有一些处理敏感信息(如密码)的含义。由于字符串不能通过编程方式清除,理想情况下,您不希望将密码存储为这样。如果改为将其存储为字符数组,则可以使用Arrays.fill(' ')覆盖密码,并保证密码从此不再驻留在内存中

    回到主题——如果对象没有在其他地方被引用,那么这两个操作都会使对象符合垃圾收集的条件,这是对的。收集clear()确实是一次删除对集合中所有对象的引用的最快方法

  3. # 3 楼答案

    您可以发起对系统的调用。gc(),但这通常不是一个好主意

  4. # 4 楼答案

    请注意,WeakHashMap允许您将对象放置在其中,并在映射之外不再有对键(而不是值)的引用时使它们符合垃圾收集的条件-此时映射条目将消失

    一般来说,当对象被垃圾收集时,您不应该担心——JVM决定了这一点,它比您更了解其内存需求和可能的延迟。您应该担心的是确保不再需要的对象有资格进行垃圾收集

  5. # 5 楼答案

    要真正地进行垃圾收集,就不能有对对象的强引用。带有weakReference's的对象可以是garbage collected。使用WeakHashMap确保它们是垃圾收集的,因为在HashMap中仍然存在对对象的引用

  6. # 6 楼答案

    是的,如果集合是这些对象的最后一个引用位置,则从集合中删除这些对象后,它们有资格进行垃圾收集。不,你不能强行摧毁这些物体。垃圾收集器会在感觉需要时处理它们