Сегодня встретил следующую фразу "Класс String-кэширует хэш-код при первом вызове метода hashCode
". Вопросы: Зачем он его кэширует? Почему при первом вызове? Почему именно хэш-код?
Очевидно предположить что это связано с его immutable
свойством, но все равно в душе не предполагаю какими есть ответы на эти вопросы(
Если не сложно поясните пожалуйста кто знает ответы.
Ну вообще говоря, это очень типовая практика в Java кешировать некоторые результаты именно таким образом.
Потому что до первого вызова hashcode
может и вовсе не потребуется, соотвественно нет никакого смысла его считать заранее. С другой стороны, если приложение запросило hashcode
, то нужно вернуть ему корректное значение.
Потому что за счет иммутабельности строк хэш-код у строки всегда одинаковый, поэтому никто не мешает его сохранить. К тому же это займет не так много места.
Для той же причины, что любое кэширование - для производительности. Вычисление hashcode
операция довольно затратная (требуется пройти всю строку и вычислить некоторое значение), с другой стороны hashcode
активно используется при работе с различными коллекциями (set, map и т.д.), соотвественно закешировав это значение можно несколько ускорить работу программы при относительно небольших затратах памяти.
Зачем он его кэширует?
Затем, чтобы при повторном вызове hashCode()
не вычислять хэш-код заново.
Почему при первом вызове?
Потому что до первого вызова метода hashCode()
хэш-код еще не рассчитан, а отдать что-то нужно.
Очевидно предположить что это связано с его immutable свойством
Да, связано. Так как строки неизменяемы, то хэш-код можно закэшировать и не рассчитывать каждый раз заново.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Вот варианты применения этих методовКогда какой использовать и чем они отличаются?
Есть несколько классов объекты которых должны создаваться спрингом:
Есть проблема с одной олимпиадной задачей, но решить мне её нужно на 100Задача находится https://www