WeakHashMap or HashMap?



因此,我有一个从ORM/HHibernate 相互引用的对象链

  • 欧洲大陆
    • 有许多国家
    • 有许多州
    • 有很多城市
    • 有许多城市部分
  • 国家
    • 有一个国家
    • 有许多州
    • 有很多城市
    • 有许多城市部分
    • 有一个大陆
    • 有一个国家
    • 有很多城市
    • 有许多城市部分
  • 城市
    • 有一个大陆
    • 有一个国家
    • 有一个州
    • 有许多城市部分
  • 城市部分
    • 有一个大陆
    • 有一个国家
    • 有一个州
    • 有一个城市

对于某些方法,我需要能够进行一些快速查找来识别键。

因此,我目前在所有具有Many的对象中都可以快速查找内存中对象的Id,而无需在执行线程的生命周期内启动大量数据库查询

HashMap<Integer,Country>     countriesTable
HashMap<Integer,State>       statesTable
HashMap<Integer,City>        citiesTable
HashMap<Integer,CityPart>    citypartsTable

但我担心的是循环引用被保留,对象永远不会被垃圾收集清除,因为它们都通过ORM关系相互引用,并且都有指向每个的私有映射

现在我读到了关于WeakHashMap的文章,如果没有更多的强引用,它将清除引用。

问题是在我的情况下是否建议使用WeakHashMap,或者Hashmap是否足以为我提供服务,并且这种设置和循环引用不会损害我的内存管理。

如果有3个对象构建了一个隔离岛(A->B->C->A),而这些对象都没有从其他任何地方引用,那么垃圾收集可以毫无问题地将它们全部丢弃。

但是WeakHashMap对您的情况没有帮助,因为在WeakHashMap中,只有键被弱引用。(WeakHashMapJavaDoc的第一句话是"Map接口的基于哈希表的实现,带有弱键。")这些值仍然是硬引用。所以WeakHashMap对你的情况没有帮助。如果用作键的Integer对象没有从其他地方引用,例如从对象内部引用,情况会更糟,因为它们最终有资格进行垃圾收集和丢弃。

如果Integer对象没有在其他地方引用,则需要一个普通的HashMap;如果这些对象是从对象中引用的对象,则需要WeakHashMap,但您还必须将值包装在WeakReference实例中,然后在从映射检索对象时,检查它们是否仍然可用或已被垃圾收集。

相关内容

  • 没有找到相关文章

最新更新