9

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

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

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

最初我想使用字符串包装器,但同样由于哈希图的工作方式(通过使用哈希码),创建一个新的字符串包装器不会得到我需要的值,如果我存储了字符串包装器,那会破坏目的通过始终存储对密钥的强引用(防止从弱哈希图中删除密钥)。

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

4

1 回答 1

12

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

此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。一旦这样的键被丢弃,它就永远无法重新创建,因此以后不可能在 WeakHashMap 中查找该键并惊讶于它的条目已被删除。此类将非常适用于其 equals 方法不基于对象标识的关键对象,例如 String 实例。然而,使用这种可重新创建的键对象,自动删除键已被丢弃的 WeakHashMap 条目可能会令人困惑。

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

Java Weak Hash Map - 需要根据值的弱点而不是键来删除条目

于 2014-04-13T04:17:12.933 回答