WeakHashMap 还是 HashMap?

WeakHashMap or HashMap?

所以我有一个从 ORM/Hibernate 相互引用的对象链

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

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

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

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

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

问题是是否建议在我的情况下使用 Wea​​kHashMap,或者 Hashmap 是否足以满足我的需求,这种设置和循环引用不会损害我的内存管理。

如果您有 3 个构建隔离岛的对象 (A->B->C->A),并且其中 none 从其他任何地方引用,垃圾回收可以毫无问题地将它们全部丢弃。

但是 WeakHashMap 对您的情况没有帮助,因为在 WeakHashMap 中只有键被弱引用。 (来自 WeakHashMap JavaDoc 的第一句话是 "Hash table based implementation of the Map interface, with weak keys.")这些值仍然是硬引用。所以 WeakHashMap 对你的情况没有帮助。如果用作键的 Integer 对象未从其他地方引用,例如。 G。从对象内部来看,情况更糟,因为它们有资格进行垃圾收集并最终被丢弃。

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