5

如果我有一个可序列化的java对象,其中hashcode方法没有被覆盖,然后我通过网络传输java对象并在接收端重建java对象,那么hashcode方法会返回相同的值吗?

它是由 Java API 指定的还是基于 JVM 的实现?

4

4 回答 4

5

Java 语言规范、Java 虚拟机规范或对象序列化规范中没有任何内容这样说。所以你不能依赖它,无论在任何特定情况下你可能会观察到什么行为。

于 2013-10-28T07:43:28.273 回答
2

这取决于,正如其他人所说,如果您依赖瞬态字段,那么哈希码的值会有所不同,但这也取决于您的哈希码是如何实现的。如果您的哈希码方法取决于使用瞬态对象或默认方法的对象的哈希码(或本身取决于使用这些方法的对象),那么哈希码很可能最终会有所不同。

虽然标准没有指定,但对象的默认哈希码通常只返回它们的内部地址,这显然会根据 jvm 运行在哪台机器上而有所不同......总的来说,我不会依赖你的任何哈希码方法序列化/反序列化后不控制返回相同的东西

于 2013-10-28T04:33:50.443 回答
0

在序列化期间,一些字段可能不会被序列化,例如瞬态字段。在这种情况下,序列化对象的哈希码将与原始哈希码不同。

于 2013-10-28T02:49:39.017 回答
0

如果我们依赖于 Object 类 hashCode 方法,我们将在所有情况下得到反序列化对象和原始对象之间的 hashCode 差异。您可以通过将任何用户对象序列化到文件来测试它。

于 2014-02-16T12:44:19.960 回答