【问题标题】:Set a HashMap to null or to a new HashMap?将 HashMap 设置为 null 还是设置为新的 HashMap?
【发布时间】:2020-07-15 13:55:19
【问题描述】:

在我的项目中,我有一些 HashMaps 我会经常重用,我被告知 HashMaps 会导致内存泄漏,并且 Map#clear 不是很有效,我应该将我的 HashMap 设置为 null,但是,我认为在每次使用 HashMap 之前进行空检查看起来很难看,那么将 HashMap 设置为 Maps#newHashMap 是否可以实现相同的目标,或者我应该将其设置为 null 并在每次使用之前执行空检查?

【问题讨论】:

  • “我被告知 HashMaps 会导致内存泄漏,并且 Map#clear 不是很有效,我应该将我的 HashMap 设置为 null”我从未听说过 HashMaps 专门有这个问题。无论如何将它们设置为null 只是确保您忘记检查它的某个代码路径并最终得到一个NPE。你真的有必要重复使用它们吗?
  • 为什么要重复使用地图?这不是典型的做法。 (忽略那些告诉你clear()“无效”的人。)
  • HashMap 基本上是一个乘客列表,以乘客为键,值为目的地,我可以通过另一种方法将其直接存储给乘客,但不能直接添加到它是类,因为它来自 api。我应该寻找其他类型的数据存储吗?有人可以向我解释为什么重复使用地图是不好的吗?
  • 为什么要把所有的乘客一起扔掉?移除一名或多名乘客的remove 操作似乎是一个合理的选择。
  • @user7 Maps#remove 或 = null 在 forEach 之后被调用,所以应该基本相同,对吧?

标签: java hashmap


【解决方案1】:

如果您想在某个时间点丢弃地图中的所有条目,调用clear 将删除所有条目。这是O(n),因为它必须从地图中删除所有条目。

将其设置为 null 的唯一原因(据我所知)是删除对地图内容的引用。如果没有其他对它们的活动引用,这将导致垃圾回收器收集映射中的对象。

但如果正在使用地图,最好使用空地图对其进行初始化,因为它可以达到相同的目的。

【讨论】:

  • clear 如果其他对象持有对地图的引用并可能访问它(尽管使用普通的 HashMap 显然存在一些并发问题的风险),这将是有意义的。除此之外,是的,只是去一张新地图。
  • @FrankHopkins 对象是否持有对地图的引用并不重要。无论如何,我会清除/摆脱它们。如果地图是唯一的引用者,他们最终会被 GC'ed。
  • 不,我的意思是多个“事物”,比如处理程序,知道同一个地图并在地图的内容上进行操作。 IE。 UserHandler 维护地图,但与 PlaneHandler 共享对它的访问。在大多数情况下,您希望避免这样的事情,但在某些情况下它可能会发生并且有意义。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2018-10-30
  • 2012-10-25
相关资源
最近更新 更多