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

我正在查看HashMap的来源。

一个。HashMapimplements Serializable

好的,这是为了让它可以作为一个对象进行蠕动/传输。

但是我看到哈希表本身被标记为.transient

我不明白。如果将其标记为瞬态,这是否意味着不应对其进行序列化?

但所有数据都在表中。那么为什么会这样呢?transient

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


答案 1

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

您可以在序列化的 javadoc 中阅读有关这些方法以及执行自定义序列化(和)的其他一些方法的更多信息。writeReplacereadResolve


答案 2

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