我在一篇文章中读到,JVM提供的默认serialVersionUid是对象的哈希码。如果我们不重写类中的hashcode方法,那么在反序列化期间如何计算哈希码,因为通常hashcode是对象的内存地址?
答案 0 :(得分:1)
我在一篇文章中读到,JVM提供的默认
serialVersionUid
是对象的哈希码。
那是不正确的。 (或者文章不正确,或者您误读了/误解了。)
可序列化类的默认串行版本UID与hashCode完全无关。
此处描述了生成默认序列版本UID的算法:
基本上,它从类名称,修饰符,接口名称以及其字段,构造函数和方法的签名创建SHA-1哈希。然后,它将获取哈希的前8个字节,并将它们组合成long
。
答案 1 :(得分:1)
我认为你误会了。不是hashcode
。 serialVersionUid
是静态变量,hashcode
是实例方法,对象的哈希码值随对象的不同而变化。
serialVersionUid
是根据类的结构(字段,方法等)计算的。它在http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html中指定
http://download.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100获取确切格式。
该规范描述了没有提供任何值会发生什么,但是自动生成使用相同的算法。
流中的项目顺序如下:
类名。
以32位整数形式编写的类修饰符。
每个接口的名称按名称排序。
对于按字段名称排序的类的每个字段(私有字段除外) 静态和私有瞬态字段:
如果存在类初始值设定项,则写出以下内容:
对于按方法名称和签名排序的每个非私有构造函数:
对于按方法名称和签名排序的每个非私有方法:
long hash
=((sha [0] >>> 24)&0xFF)|
((sha [0] >>> 16)&0xFF)<< 8 |
((sha [0] >>> 8)&0xFF)<< 16 |
((sha [0] >>> 0)&0xFF)<< 24 |
((sha [1] >>> 24)&0xFF)<< 32 |
((sha [1] >>> 16)&0xFF)<< 40 |
((sha [1] >>> 8)&0xFF)<< 48 |
((sha [1] >>> 0)&0xFF)<< 56;
这里没有long hash
被引用hashcode