WeakHashMap还是HashMap?

时间:2016-04-12 13:19:47

标签: java hibernate hashmap weak-references weakhashmap

所以我有一个从ORM / Hibernate

引用的对象链
    • 有很多国家
    • 有很多州
    • 有很多城市
    • 有很多城市部分
  • 国家
    • 有一个国家/地区
    • 有很多州
    • 有很多城市
    • 有很多城市部分
    • 有一个大陆
    • 有一个国家/地区
    • 有很多城市
    • 有很多城市部分
    • 有一个大陆
    • 有一个国家/地区
    • 有一个州
    • 有很多城市部分
  • 城市部分
    • 有一个大陆
    • 有一个国家/地区
    • 有一个州
    • 有一个城市

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

因此,我目前拥有所有具有Many的对象,能够快速查找内存中对象的Id,而无需在执行的生命周期中触发大量数据库查询螺纹

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

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

现在我已经阅读了WeakHashMap,如果没有更强的引用,它将清除引用。

问题是在我的情况下使用WeakHashMap是否可取,或者Hashmap是否足够服务,这种设置和循环引用不会影响我的内存管理。

1 个答案:

答案 0 :(得分:3)

如果你有3个对象构建一个隔离岛(A->B->C->A)并且没有其他任何东西被引用,那么垃圾收集可以毫无问题地抛弃所有这些对象。

但是WeakHashMap对你的情况没有帮助,因为在WeakHashMap中只有弱键被引用。 (来自WeakHashMap JavaDoc的第一句话是“基于哈希表的Map接口实现,带有弱键。”)这些值仍然是硬引用。因此WeakHashMap对您的情况无济于事。如果用作键的Integer对象不是从其他地方引用的,e。 G。从对象内部来看,它更糟糕,因为它们最终有资格收集垃圾并扔掉。

如果您的Integer对象未在其他任何地方被引用,那么您需要的是正常HashMap;如果这些对象是从您的对象中引用的对象,您还需要包含该WeakHashMap WeakReference实例中的值,然后从地图中检索对象时检查它们是否仍然可用或是否已收集垃圾。