gpt4 book ai didi

java - 如何有效地将字符串用作 Java 中的 WeakHashMap 键或替代解决方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:50 27 4
gpt4 key购买 nike

我正在用 Java 管理一个存储用户数据的项目。用户可以在线,也可以离线。当用户在线时,他们的数据会加载到数据对象中以便于访问,并在他们注销时卸载。

但是,对于离线用户,为了防止同时操作数据的多个命令并发访问数据而丢失数据,我存储了一个 weakhashmap 作为加载的用户数据对象的缓存。如果任何东西需要访问离线数据对象来修改它,系统将首先检查缓存,然后再从文件加载它。

我唯一能想到如何存储它们的是字符串键,代表用户的用户名。但由于 Java 的工作方式,由于 VM 的字符串缓存系统,这似乎并不总是有效。

最初我想使用字符串包装器,但再次由于 HashMap 的工作方式(通过使用哈希码),创建新的字符串包装器不会获得我需要的值,如果我存储字符串包装器,那会通过始终存储对 key 的强引用(防止从 weakhashmap 中删除 key )来破坏目的。

也许我只是不明白 weakhashmap 应该如何使用 :S 如果这不是 weakhashmap 应该如何使用,我愿意接受关于如何做我想做的事情的其他想法。

最佳答案

其行为不可预测的原因在本段最后一句的 WeakHashMap 的 Javadoc 中进行了解释:

This class is intended primarily for use with key objects whose equals methods test for object identity using the == operator. Once such a key is discarded it can never be recreated, so it is impossible to do a lookup of that key in a WeakHashMap at some later time and be surprised that its entry has been removed. This class will work perfectly well with key objects whose equals methods are not based upon object identity, such as String instances. With such recreatable key objects, however, the automatic removal of WeakHashMap entries whose keys have been discarded may prove to be confusing.

您真正想要的是一个映射,其中条目在值被垃圾收集时被删除,而不是在键被垃圾收集时删除 - 也就是说,值是弱的,而不是键是弱的。您可以在这个问题上找到有关该问题的帮助:

Java Weak Hash Map - Need to remove entry based on weakness of value, not key

关于java - 如何有效地将字符串用作 Java 中的 WeakHashMap 键或替代解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038912/

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