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

Cra*_*lus 24 java collections serialization dictionary hashmap

我正在查看HashMap的来源.

HashMap implements Serializable.

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

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

我不明白你this.If其标记为短暂的,不这意味着它应该被序列化?

但是所有数据都在表格中.所以为什么呢transient

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

Col*_*inD 33

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

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

  • 对象的哈希码可能在程序的运行之间发生变化 - 例如,如果hashCode()使用默认的Object实现 - 那么必须在反序列化期间重建哈希表. (10认同)

tza*_*man 13

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

  • 尺寸.`Entry`表大于键列表. (2认同)