2012-02-04 2 views
23

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

A HashMapimplements Serializable.

Хорошо, это так, что оно может быть перемещено/передано как объект.

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

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

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

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

ответ

31

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

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

+0

Я вижу эти методы. Мне было интересно, почему это так? Есть ли причина? – Cratylus

+9

Хэш-код объектов может меняться между прогонами программы - например, если hashCode() использует реализацию Object по умолчанию, поэтому хеш-таблицу необходимо перестроить во время десериализации. –

11

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

+0

Это для размера или скорости? Потому что при десериализации вы все равно получите таблицу того же размера. – Cratylus

+1

Размер. Таблица 'Entry' больше, чем список ключей. – tzaman

Смежные вопросы