Я намерен сериализовать и десериализовать хэш-карту, чей ключ является строкой.
От Джоша Блоха Эффективная Java, я понимаю следующее. С .222
Например, рассмотрим случай хэш-таблицы. Физическое Представление представляет собой последовательность хэш-кодов, содержащих значение ключа записей. Какое ведро находится вхождение, является функцией хэша код ключа, который не является, в общем, гарантированно одинаковым от реализации JVM до реализации JVM. На самом деле это даже не гарантированно будет одинаковым от запуска до запуска на одной JVM реализация. Поэтому принятие стандартной сериализованной формы для хеш-таблица станет серьезной ошибкой. Сериализация и десериализация хэш-таблицы может дать объект, инварианты которого были серьезно повреждены.
Мои вопросы: 1) В общем случае, если переопределить равные и хэш-коды ключевого класса карты, решить эту проблему, и карта может быть правильно восстановлена?
2) Если мой ключ - это String, а класс String уже переопределяет метод hashCode(), у меня будет проблема, описанная выше. (Я вижу ошибку, которая заставляет меня думать, что это, вероятно, все еще проблема, хотя ключ - это String с переопределяющим hashCode.)
3) Раньше я обошел эту проблему, сериализуя массив записей (ключ, значение), и при десериализации я бы восстановил карту. Мне интересно, есть ли лучший подход.
4) Если ответы на вопросы 1 и 2 о том, что они все еще не могут быть гарантированы, может кто-нибудь объяснить, почему? Если хэш-коды одинаковы, они переходят в одни и те же ведра в JVM?
Спасибо, Грейс