如果我有一个可序列化的java对象,其中hashcode方法没有被覆盖,然后我通过netwrok和接收端传输java对象,重构java对象,那么hashcode方法会返回相同的值吗? / p>
它是由Java API指定的还是基于JVM依赖的实现?
答案 0 :(得分:5)
Java语言规范,Java虚拟机规范或对象序列化规范中没有任何内容可以这样说。因此,无论在任何特定情况下您可能会发生什么行为,您都不能依赖它。
答案 1 :(得分:2)
这取决于,正如其他人所说,如果你依赖于瞬态字段,那么哈希码的值会有所不同,但它也取决于你的哈希码的实现方式。如果你的hashcode方法依赖于使用瞬态对象或默认方法的对象的哈希码(或者它本身依赖于使用那些对象的对象),那么哈希码可能最终会有所不同。
虽然标准没有指定,但是对象的默认哈希码通常只返回它们的内部地址,这显然会有所不同,具体取决于运行jvm的机器.....总的来说,我不会依赖任何哈希码在序列化/反序列化后,您无法控制返回相同内容的方法
答案 2 :(得分:0)
在序列化过程中,某些fieds可能不会被严重删除,例如瞬态字段。在这种情况下,序列化对象的哈希码将与原始对象不同。
答案 3 :(得分:0)
如果我们依赖于Object类hashCode方法,我们将在所有情况下在deserilized对象和原始对象之间获得hashCode的区别。你可以通过将任何用户对象serailizing到文件来测试它。