HashMap のソースを調べていました。
HashMap
implements Serializable
。
これは、オブジェクトとして永続化/送信できるようにするためです。
しかし、ハッシュテーブル自体がtransient
としてマークされているのがわかります。
これを取得できません。一時的なものとしてマークした場合、これはシリアル化する必要があることを意味します?
しかし、すべてのデータが表に含まれています。では、なぜtransient
なのでしょうか。
多分私はSerializable
がどのように機能するのか混乱していますか?
HashMap
は、フィールドを通常どおりシリアル化するだけでなく、writeObject
およびreadObject
を使用してカスタムシリアル化を実装します。バケットの数、合計サイズ、各エントリをストリームに書き込み、逆シリアル化されたときにそれらのフィールドから自分自身を再構築します。 tzamanが言うように、テーブル自体はシリアル形式では不要なので、スペースを節約するためにシリアル化されません。
これらのメソッドおよびカスタムシリアル化を行う他のいくつかのメソッド(writeReplace
およびreadResolve
)の詳細については、 Serializable javadocを参照してください。
transient
キーワードは、フィールドをクラスのシリアル化された表現に含めないことを示します。 Entry[]
HashMap
のテーブルは、単なる加速構造です。これにより、格納されたエントリをすばやく検索できます。エントリのリストから逆シリアル化するときにテーブルを再構築できるため、テーブル全体をシリアル化する必要はなく、テーブルに含まれるエントリのみをシリアル化する必要があります。