為什么HashMap要自己實現(xiàn)writeObject和readObject方法?
在Java中,HashMap
類實現(xiàn)了Serializable
接口,該接口用于支持對象的序列化和反序列化。當(dāng)一個對象需要被序列化時,它的狀態(tài)會被轉(zhuǎn)換成字節(jié)序列,以便在網(wǎng)絡(luò)上傳輸或者保存到文件系統(tǒng)中。而當(dāng)對象需要被反序列化時,字節(jié)序列會被還原成一個完整的對象。
HashMap
自己實現(xiàn)了writeObject
和readObject
方法,是因為它需要對其內(nèi)部的數(shù)據(jù)結(jié)構(gòu)進(jìn)行自定義的序列化和反序列化操作。
writeObject
方法:當(dāng)HashMap
對象被序列化時,該方法會被調(diào)用。HashMap
實現(xiàn)了自定義的序列化邏輯,它通過調(diào)用putForCreate
方法將所有的鍵值對轉(zhuǎn)換成一個Entry
對象,并將這些對象寫入輸出流中。這樣,在反序列化時,可以根據(jù)寫入的信息重新構(gòu)建HashMap
對象。readObject
方法:當(dāng)HashMap
對象被反序列化時,該方法會被調(diào)用。HashMap
實現(xiàn)了自定義的反序列化邏輯,它首先從輸入流中讀取HashMap
的容量和負(fù)載因子等信息,然后通過調(diào)用inflateTable
方法創(chuàng)建一個新的空白表。接下來,它會循環(huán)讀取Entry
對象,并使用putForCreate
方法將這些對象插入到新表中,從而還原了HashMap
的狀態(tài)。
通過自己實現(xiàn)writeObject
和readObject
方法,HashMap
可以在序列化和反序列化過程中對自身進(jìn)行完全的控制,確保在反序列化時能夠正確地重建內(nèi)部的數(shù)據(jù)結(jié)構(gòu)。