Java中的HashMap中的transient Entry[] table;要特地不序列化
搜了一圈,大概整理要点如下:
前提知识:
HashMap 是 一种 Map ,使用 HashCode 进行索引等相关操作,所以叫 HashMapHashCode 是一个 native 方法 ,详见 java.lang.Object#hashcode()不同的 JVM 对 native 方法 有不同的实现。因此,当一个 HashMap 序列化后,被另外一个(不同的) JVM 进行反序列化时:
由于不同的JVM 的 HashCode 的策略有所不同,使用原来 JVM 上计算的 HashCode 值在另外一个 JVM 上计算会引起错误。
所以,如果要序列化一个 HashMap ,需要剔除 hashcode 的影响,所以属性标识成了 transient 类型。
为了实现序列化,内部自定义了序列化的相关策略如下:(HashMap.java)private void writeObject(java.io.ObjectOutputStream s) throws IOException { int buckets = capacity(); // Write out the threshold, loadfactor, and any hidden stuff s.defaultWriteObject(); s.writeInt(buckets); s.writeInt(size); internalWriteEntries(s); }
把 buckets、size 、threshold 等属性进行直接的序列化。
对于 HashMap 内的 EntrySet 的序列化方法写在 internalWriteEntries 方法里:(HashMap.java)// Called only from writeObject, to ensure compatible ordering. void internalWriteEntries(java.io.ObjectOutputStream s) throws IOException { Node\u0026lt;K,V\u0026gt; tab; if (size \u0026gt; 0 \u0026amp;\u0026amp; (tab = table) != null) { for (int i = 0; i \u0026lt; tab.length; ++i) { for (Node\u0026lt;K,V\u0026gt; e = tab; e != null; e = e.next) { s.writeObject(e.key); s.writeObject(e.value); } } } }
可以看到是通过 for 循环遍历 Node 进行的序列化操作,把核心数据进行的 writeObject 操作。
■网友
【Java中的HashMap中的transient Entry[] table;要特地不序列化】 去看看序列化的条件以及作用
推荐阅读
- 鄂温克冬季马赛-30℃极寒开赛:寒冬中的火热派对
- 大雪@大雪腌肉 适当进补 今日大雪
- |电商事业中的“闪光少年”
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- hadoop中的mapreduce链接(mapreduce chaining)怎样避免中间文件的产生
- 经观汽车|日系车企中的“异类”?东风日产将导入e-POWER技术大干增程式混动 | 经观汽车
- 中年|这些东西,比你想象中的还要大得多!
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 请问杨毅微博中的这两人是谁
- 某些公司招聘要求中的精通mysql是啥程度