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;要特地不序列化】 去看看序列化的条件以及作用


    推荐阅读