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

Java 为什么HashMap的哈希表标记为transient,尽管该类是可序列化的,java,serialization,dictionary,collections,hashmap,Java,Serialization,Dictionary,Collections,Hashmap,我在看这张照片的来源 HashMap实现可序列化 好的,这是为了它可以作为一个对象被观察/传输 但是我看到哈希表本身被标记为transient 我不明白。如果你把它标记为transient,这不是意味着它应该而不是被序列化吗 但是所有的数据都在表中。那么为什么它是瞬态的呢 也许我对Serializable的工作原理感到困惑 HashMap使用writeObject和readObject实现自定义序列化,而不仅仅是让其字段正常序列化。它将bucket的数量、总大小和每个条目写入流,并在反序列化时从

我在看这张照片的来源

HashMap
实现可序列化

好的,这是为了它可以作为一个对象被观察/传输

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

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

但是所有的数据都在表中。那么为什么它是瞬态的呢


也许我对
Serializable
的工作原理感到困惑

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


您可以在javadoc中阅读更多关于这些方法和一些其他自定义序列化方法(
writeReplace
readResolve
)的信息。

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

我看到了这些方法。我想知道为什么会这样做?有什么原因吗?对象的哈希代码在程序运行期间可能会发生变化——例如,如果hashCode()使用默认的对象实现--因此在反序列化期间必须重建哈希表。这是为了大小还是速度?因为在反序列化过程中,最终得到的表大小相同。size。
条目
表大于键列表。