我打算序列化和反序列化其键是字符串的hashmap.
从Josh Bloch的Effective Java,我理解以下内容.第222页
例如,考虑哈希表的情况.物理表示是包含键值条目的一系列散列桶.放入条目的哪个桶是密钥的哈希码的函数,通常保证从JVM实现到JVM实现不相同.事实上,从运行到同一JVM实现运行甚至不保证是相同的.因此,接受哈希表的默认序列化表单将构成严重错误.序列化和反序列化哈希表可能会产生一个不变量严重损坏的对象.
我的问题是:1)一般来说,覆盖地图的关键类的等于和哈希码会解决这个问题并且地图可以正确恢复吗?
2)如果我的键是一个String并且String类已经覆盖了hashCode()方法,我是否还会遇到上述问题.(我看到一个错误,让我觉得这可能仍然是一个问题,即使键是重写hashCode的String.)
3)以前,我通过序列化一系列条目(键,值)解决了这个问题,并且在反序列化时我会重建地图.我想知道是否有更好的方法.
4)如果问题1和2的答案仍然无法保证,有人可以解释原因吗?如果hashCodes是相同的,他们会跨JVM转到相同的存储区吗?
谢谢,格雷斯
据我所知,Google Collections的alpha版本中的ReferenceMap已被MapMaker取代.
我将这个ReferenceMap构造函数与支持映射一起使用:
public ReferenceMap(ReferenceType keyReferenceType, ReferenceType
valueReferenceType, ConcurrentMap<Object, Object> backingMap) {
this(keyReferenceType, valueReferenceType, backingMap, true);
}
Run Code Online (Sandbox Code Playgroud)
我的支持地图是一个能够收集统计数据(命中/未命中等)的并发映射.
我可以用什么来代替上面的ReferenceMap构造函数?
谢谢,格雷斯