序列化后的Java哈希码更改

时间:2016-11-16 22:24:54

标签: java hashcode

我正在使用java序列化将对象保存到文件中。由于我使用hashCode()来检查对象是否发生了变化(我知道,我知道可能发生哈希冲突),从内存加载后,对象的哈希码会发生变化(对象的hashCode可以保存在内存中之前)从我从内存中加载它后会得到的不同吗?

我问这个是因为如果我的对象有一个指向另一个对象的变量_myOtherObject,在我从内存中加载后,_myOtherObject可能会存储在不同的内存地址中,这将使_myOtherObject的值发生变化使我从内存加载的对象的哈希码发生变化。我的想法是对的吗?

感谢。

1 个答案:

答案 0 :(得分:1)

这取决于如何计算哈希码。但如果计算涉及使用Object.hashCode()System.identityHashCode(Object),那么它可能会改变。

这些哈希基于对象标识和对象引用==语义。反序列化的对象将具有与原始对象不同的标识,并且不会==。因此,哈希码可能(并且可能会)不同。

第二个问题是,如果使用不同版本的类(包括不同版本的库类)对其进行序列化和反序列化,则可能导致上述身份问题的无关。在大多数情况下,用于计算库类中的哈希码的算法不是API规范的一部分/