2012-02-04 9 views
23

Stavo cercando la fonte di HashMap.Perché la tabella hash di HashMap è contrassegnata come transitoria sebbene la classe sia serializzabile

A HashMapimplements Serializable.

Ok questo è così che può essere peristato/trasmesso come oggetto.

Ma vedo che la tabella stessa è contrassegnata come transient.

Non capisco. Se lo contrassegni come transitorio, non significa che dovrebbe essere non essere serializzato?

Ma tutti i dati sono nella tabella. Perché è transient?

Forse sono confuso su come funziona Serializable?

risposta

31

HashMap utilizza writeObject e readObject per implementare la serializzazione personalizzata piuttosto che lasciare che il proprio campo venga serializzato normalmente. Scrive il numero di bucket, la dimensione totale e ciascuna voce dello stream e si ricompone da quei campi quando deserializzato. Come dice tzaman, il tavolo stesso non è necessario nella forma seriale, quindi non è serializzato per risparmiare spazio.

È possibile leggere ulteriori informazioni su questi metodi e su altri metodi di serializzazione personalizzata (writeReplace e readResolve) nel file Serializable javadoc.

+0

Vedo questi metodi. Mi chiedevo perché fa così? C'è una ragione? – Cratylus

+9

Il codice hash degli oggetti può cambiare tra le esecuzioni del programma, ad esempio se hashCode() utilizza l'implementazione Object predefinita, quindi la tabella hash deve essere ricostruita durante la deserializzazione. –

11

La parola chiave transient indica che un campo non deve essere incluso nella rappresentazione serializzata di una classe. La tabella Entry[] di un HashMap è semplicemente una struttura di accelerazione, che consente una rapida ricerca delle voci memorizzate. Non è necessario serializzare l'intera tabella stessa, ma solo le voci che contiene, poiché la tabella può essere ricostruita nuovamente quando deserializza dall'elenco delle voci.

+0

Questo è per dimensioni o velocità? Perché in deserializzazione si finisce con un tavolo della stessa dimensione comunque. Dimensione – Cratylus

+1

. La tabella 'Entry' è più grande della lista delle chiavi. – tzaman

Problemi correlati