Подтвердить что ты не робот

Почему хэш-таблица HashMap отмечена как переходная, хотя класс сериализуем

Я смотрел на источник HashMap.

A HashMap implements Serializable.

Хорошо, это так, что его можно перевести/передать как объект.

Но я вижу, что сама хэш-таблица отмечена как transient.

Я не понимаю этого. Если вы отмечаете его как временный, не означает ли это, что он должен не сериализоваться?

Но все данные находятся в таблице. Так почему это transient?

Возможно, я смущен тем, как работает Serializable?

4b9b3361

Ответ 1

HashMap использует writeObject и readObject для реализации пользовательской сериализации, а не просто для того, чтобы его поле было сериализовано в обычном режиме. Он записывает количество ведер, общий размер и каждую запись в поток и перестраивается из этих полей при десериализации. Как говорит tzaman, сама таблица не нужна в серийной форме, поэтому она не сериализована для экономии места.

Вы можете узнать больше об этих методах и некоторых других методах выполнения пользовательской сериализации (writeReplace и readResolve) в Serializable javadoc.

Ответ 2

Ключевое слово transient указывает, что поле не должно включаться в сериализованное представление класса. Таблица Entry[] HashMap - это просто структура ускорения - она ​​позволяет быстро находить сохраненные записи. Сама вся таблица не обязательно должна быть сериализована, только содержащиеся в ней записи, так как таблица может быть перестроена снова при десериализации из списка записей.