为什么HashMap的哈希表标记为瞬态,尽管该类是可序列化的

我正在查看HashMap的来源。

HashMap implements Serializable

好的,它可以作为对象进行存储/传输。

但我发现散列表本身被标记为transient

我不明白。如果你把它标记为瞬态,这是不是意味着它不应该被序列化?

但所有的数据都在表格中。那为什么它是transient

也许我对Serializable如何工作感到困惑?

HashMap使用writeObjectreadObject来实现自定义序列化,而不是让它的字段正常序列化。 它将桶的数量,总大小和每个条目写入流,并在反序列化时从这些字段重建自身。 正如tzaman所说,表本身在串行forms中是不必要的,因此它不是为了节省空间而序列化的。

您可以在Serializable javadoc中阅读有关这些方法和其他一些自定义序列化( writeReplacereadResolve )的方法。

transient关键字表示字段不应包含在类的序列化表示中。 HashMapEntry[]表只是一个加速结构 – 它允许快速查找存储的条目。 整个表本身不需要序列化,只需要序列化它包含的条目,因为在从条目列表反序列化时可以再次重建表。