关于java:WeakHashMap或HashMap?

WeakHashMap or HashMap?

所以我有一连串的对象相互引用,它们来自ORM / Hibernate

  • 大陆

    • 有很多国家
    • 有很多state
    • 有很多城市
    • 有很多城市
  • 国家

    • 有一个国家
    • 有很多state
    • 有很多城市
    • 有很多城市
  • 状态

    • 有一个大陆
    • 有一个国家
    • 有很多城市
    • 有很多城市
  • 城市

    • 有一个大陆
    • 有一个国家
    • 有一个state
    • 有很多城市
  • 城市部分

    • 有一个大陆
    • 有一个国家
    • 有一个state
    • 有一个城市

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

因此,我目前在所有具有对象的对象中都有许多对象可以在内存中快速查找对象的ID,而不必在执行线程的生命周期内触发大量的数据库查询

1
2
3
4
HashMap<Integer,Country>     countriesTable
HashMap<Integer,State>       statesTable
HashMap<Integer,City>        citiesTable
HashMap<Integer,CityPart>    citypartsTable

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

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

问题是在我的情况下使用WeakHashMap是否可取,还是由Hashmap提供足够的服务,并且此设置和循环引用不会损害我的内存管理。


如果您有3个对象建立了一个隔离岛(A->B->C->A),但没有其他地方引用这些对象,则垃圾回收可以将它们全部扔掉而没有问题。

但是WeakHashMap在您的情况下无济于事,因为在WeakHashMap中,仅弱引用了键。 (来自WeakHashMap JavaDoc的第一句话是"具有弱键的Map接口基于哈希表的实现。")这些值仍然是硬引用。因此,WeakHashMap对您的情况无济于事。如果未从其他地方引用用作键的Integer对象,则e。 G。在对象内部,情况甚至更糟,因为它们才有资格进行垃圾回收并最终被丢弃。

如果没有在其他任何地方引用Integer对象,则需要一个普通的HashMap;如果这些对象是从对象内部引用的,则需要一个WeakHashMap,但还必须将值package在实例,然后从地图中检索对象时,请检查它们是否仍然可用或已被垃圾回收。