Cor*_*Kay 8 java caching data-storage weakhashmap data-loss
我正在用Java管理一个存储用户数据的项目.用户可以在线或离线.当用户在线时,他们的数据被加载到数据对象中以便于访问,并在他们注销时卸载.
但是,对于离线用户,为了防止数据同时访问来自同时操作数据的多个命令的数据,我将weakhashmap存储为加载的用户数据对象的缓存.如果需要访问脱机数据对象以进行修改,系统将在从文件加载之前先检查缓存.
我能想到如何存储它们的唯一方法是使用字符串键,它代表用户的用户名.但是由于java的工作原理,由于VM的字符串缓存系统,这似乎并不总是有效.
最初我想过使用字符串包装器,但是再次因为hashmaps如何工作(通过使用hashcode),创建一个新的字符串包装器不会得到我需要的值,如果我存储了字符串包装器,那将失败目的通过始终存储对密钥的强引用(防止从weakhashmap中删除密钥).
也许我只是不理解如何使用weakhashmap:S如果不是如何使用weakhashmap,我愿意接受其他如何做我想做的想法.
War*_*Dew 11
其行为不可预测的原因在本段最后一句的Javadoc for WeakHashMap中进行了解释:
此类主要用于密钥对象,其等于方法使用==运算符测试对象标识.一旦丢弃了这样的密钥,它就永远不会被重新创建,因此以后不可能在WeakHashMap中查找该密钥,并且对其条目已被删除感到惊讶.这个类可以很好地处理其equals方法不基于对象标识的关键对象,例如String实例.但是,使用这种可重新调用的密钥对象,自动删除其密钥已被丢弃的WeakHashMap条目可能会令人困惑.
你真正想要的是一个地图,当值被垃圾收集时,条目被删除,而不是当密钥被垃圾收集时 - 也就是说,值为弱,而不是密钥为弱.您可以在此问题上找到有关该问题的帮助: