Вопрос по кэшировании хэш-кода string'ом

181
05 декабря 2017, 21:00

Сегодня встретил следующую фразу "Класс String-кэширует хэш-код при первом вызове метода hashCode". Вопросы: Зачем он его кэширует? Почему при первом вызове? Почему именно хэш-код?

Очевидно предположить что это связано с его immutable свойством, но все равно в душе не предполагаю какими есть ответы на эти вопросы( Если не сложно поясните пожалуйста кто знает ответы.

Answer 1

Ну вообще говоря, это очень типовая практика в Java кешировать некоторые результаты именно таким образом.

  1. Почему при первом вызове?

Потому что до первого вызова hashcode может и вовсе не потребуется, соотвественно нет никакого смысла его считать заранее. С другой стороны, если приложение запросило hashcode, то нужно вернуть ему корректное значение.

  1. Почему именно хэш-код?

Потому что за счет иммутабельности строк хэш-код у строки всегда одинаковый, поэтому никто не мешает его сохранить. К тому же это займет не так много места.

  1. Зачем он его кэширует?

Для той же причины, что любое кэширование - для производительности. Вычисление hashcode операция довольно затратная (требуется пройти всю строку и вычислить некоторое значение), с другой стороны hashcode активно используется при работе с различными коллекциями (set, map и т.д.), соотвественно закешировав это значение можно несколько ускорить работу программы при относительно небольших затратах памяти.

Answer 2

Зачем он его кэширует?

Затем, чтобы при повторном вызове hashCode() не вычислять хэш-код заново.

Почему при первом вызове?

Потому что до первого вызова метода hashCode() хэш-код еще не рассчитан, а отдать что-то нужно.

Очевидно предположить что это связано с его immutable свойством

Да, связано. Так как строки неизменяемы, то хэш-код можно закэшировать и не рассчитывать каждый раз заново.

READ ALSO
Отличия между OutputStream, BufferedWriter и FileWriter

Отличия между OutputStream, BufferedWriter и FileWriter

Вот варианты применения этих методовКогда какой использовать и чем они отличаются?

171
Почему не инициализируются бины?

Почему не инициализируются бины?

Есть несколько классов объекты которых должны создаваться спрингом:

177
Олимпиадная задача на вероятность

Олимпиадная задача на вероятность

Есть проблема с одной олимпиадной задачей, но решить мне её нужно на 100Задача находится https://www

196