【问题标题】:Do I have to .clear() HashSet and HashMap everytime, when field is no longer used?当不再使用字段时,我是否每次都必须 .clear() HashSet 和 HashMap?
【发布时间】:2018-04-27 14:24:37
【问题描述】:

当不再使用变量时,我是否每次都必须 .clear() HashSet 和 HashMap?

我的应用程序的方法中有很多临时变量,它们是 HashSet 和 HashMap。例如,方法完成时,我是否必须每次清除它们?如果对象不再被某些东西使用,GC会自动删除它吗?

我问是因为很多人指出,如果程序完成并且存储在 hashmap 中的数据将不再被使用,我必须清除任何 hashmap 中的数据。

【问题讨论】:

  • 你问是因为this question吗?如果是这样,我认为这取决于用例。如果HashSets 和HashMaps 如此之大,它们会占用大量内存,您需要继续清理,那么可以。但答案可能是否定的,尤其是在变量很小的情况下。

标签: java hashmap garbage-collection hashset


【解决方案1】:

当 hashmap 超出范围时,它会自动被垃圾回收,所以如果你正在做的只是让被删除,你不应该调用 clear。

如果您想重复使用地图但又想清空其中的所有数据,则清除非常有用。

【讨论】:

    【解决方案2】:

    GC 会在内存不足时为您清除它.. 但最好将您不再使用的引用设置为null

    【讨论】:

      【解决方案3】:

      HashMap 和 HashSet 是 java 中的对象。因此,当一个对象不再被引用并且遥不可及时,它就会有资格进行垃圾收集。

      但是,如果您认为存在内存泄漏,那么我建议您在不需要它们之后立即将相关 HashMap 和 HashSet 的所有 Object 引用显式设置为 null。

      你可以参考这里的内存泄漏:

      https://dzone.com/articles/memory-leak-andjava-code

      如果您不确定内存泄漏,为了安全起见,您可以将对象的引用设置为 null。

      【讨论】:

      • 我了解到,如果 Object 在添加到 HashSet (stackify.com/memory-leaks-java) 之前没有实现 hashCode() 或 equal() 方法,可能会发生内存泄漏。是真的吗?
      • 理想情况下,所有 bean / POJO 样式类都应该覆盖 hashcode() 和 equals()。在这种情况下,它很有用,因为实际的重复对象被认为是唯一的。例如。 class Student{ int roll_no;} 在这里,如果您不覆盖 hashcode 并且 equals 具有相同 roll no 的方法对象将被视为不同。所以强烈建议覆盖它们。如果您使用的是 Eclipse 之类的 IDE,则可以选择生成 hashcode() 和 equals() 方法。
      • 感谢您的回复。所以 - 只有当我们点的对象是相同的(比如没有哈希码的字符串),但在 java 内存中是唯一的时它才有用?
      • 是的,因为hashmap、hashset使用hashcode和equals方法来判断你试图插入其中的对象是否已经存在。
      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 2018-09-03
      • 1970-01-01
      • 2020-09-11
      • 2017-12-24
      • 1970-01-01
      • 2019-03-29
      • 2013-04-29
      相关资源
      最近更新 更多