HashMap具有旧值,直到它们停止被引用

时间:2017-03-20 12:21:58

标签: java android concurrency hashmap

我有一种情况,我在我的Android应用程序中的HashMap内的应用程序级加载一些数据。我在此地图中使用其中一个条目(keyA中的特定HashMap)来初始化我Activity中的一些数据,此Activity会暂停一段时间。当用户参与此活动时,我引用HashMap对象的keyA可能会发生变化。更新HashMap的代码由我编写。当我想更新HashMap时,我想清除整个HashMap(以便其size()返回0)并想要再次填充所有内容。如果我调用HashMap.clear(),是否会使旧对象被垃圾收集?

如果是,清除整个HashMap的最佳方法是什么,这样如果旧对象被引用到代码中的任何其他位置,我就不会丢失它们。在这种情况下,最好将值重新分配给HashMap

PS:我使用ReentrantReadWriteLock来维护访问权限,如果这可能会有所帮助。

3 个答案:

答案 0 :(得分:2)

  

我调用HashMap.clear(),是否会使旧对象被垃圾收集?

没有。如果可以访问,则不会对Java对象进行垃圾回收。如果有任何引用(或引用链)允许您的代码访问对象,那么该对象是安全的垃圾收集。

答案 1 :(得分:1)

  

如果我调用HashMap.clear(),是否会使旧对象被垃圾回收?

HashMap只是存储对象的单个引用。当您致电clear()时,如果(且仅当)对象的唯一引用是HashMap,则对象可以是gc' d。如果代码的其他部分引用了对象,那么它就不会。这就是gc的工作方式。 HashMap不是魔法。

  

在这种情况下,将值重新分配给HashMap最好的是什么?

如果要更新共享地图中的值,那么无论何时使用它们,您的代码都必须从地图中重新获取值 - 或者可能经常使用它们。我每次使用它时都会重新获得价值,然后在做其他任何事情之前向自己证明它太贵了。

  

PS:我正在使用ReentrantReadWriteLock维护访问权限,如果这可能会有所帮助。

我转而使用ConcurrentHashMap,而不是同时使用自己进行锁定的费用和代码维护。

答案 2 :(得分:0)

如果您需要单独更新 keyA ,那么您可以使用HashMap.put("keyA","value");

这将使用您指定的值替换Ha​​shMap对象中 keyA 的值,也不会影响HashMap对象中保存的其他值。