gpt4 book ai didi

java - WeakHashMap 还是 HashMap?

转载 作者:行者123 更新时间:2023-11-30 08:02:50 24 4
gpt4 key购买 nike

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

  • 大陆
    • 有很多国家
    • 有很多状态
    • 有很多城市
    • 有很多城市
  • 国家
    • 有一个国家
    • 有很多状态
    • 有很多城市
    • 有很多城市
  • 状态
    • 拥有一个大陆
    • 有一个国家
    • 有很多城市
    • 有很多城市
  • 城市
    • 拥有一个大陆
    • 有一个国家
    • 有一个州
    • 有很多城市
  • 城市部分
    • 拥有一个大陆
    • 有一个国家
    • 有一个州
    • 有一个城市

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

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

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

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

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

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

最佳答案

如果您有 3 个对象构建一个隔离岛 (A->B->C->A),并且这些对象都没有被其他任何地方引用,垃圾回收会抛出所有这些对象没有问题。

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

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

关于java - WeakHashMap 还是 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36574584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com