我打算序列化和反序列化一个键为字符串的哈希表。
根据Josh Bloch的《Effective Java》中第222页的解释,我理解以下内容:
例如,考虑一个哈希表的情况。它的物理表示是一系列包含键值项的哈希桶。一个条目被放在哪个桶中取决于键的哈希码,这在JVM实现之间通常不保证相同。事实上,即使在同一个JVM实现上运行多次,它也不能保证相同。因此,接受哈希表的默认序列化形式将构成严重的错误。序列化和反序列化哈希表可能会产生一个不满足不变量条件的对象。
我的问题是:
1)通常情况下,如果覆盖key类的equals和hashCode方法,是否能解决这个问题并恢复哈希表?
2)如果我的key是String,而String类已经覆盖了hashCode()方法,那么我仍然会遇到以上描述的问题吗?(我看到一个bug,让我认为即使key是String并覆盖了hashCode,这可能仍然是个问题。)
3)以前,我通过序列化条目(key,value)数组来绕过这个问题,并在反序列化时重建哈希表。我想知道是否有更好的方法。
4)如果问题1和2的答案是仍然无法保证,有人能解释一下原因吗?如果哈希码相同,它们会在JVM之间的相同桶中吗?