пятница, 9 декабря 2016 г.

Как Get метод HashMap'а или Hashtable'а работает внутри Java.


В этой статье пересмотрим пару интересных вопросов связанных с внутренней работой HashMap в Java, наболее часто спрашиваемых у senior Java разработчиков, с опытом от 4 до 6 и свыше 8 лет работы. Я сделал обзор многих этих вопросов про HashMap, начиная от безопасности потоков в условиях гонки, в моем посте об internal working of Java HashMap, но я думал об пересмотре двух таких вопросах, Как get метод HashMap или Hashtable работает внутри Java и Что случается если два различных ключа возратят тотже hashCode,  как делаете вы возврат значения из HashMap в этом случае. Эти вопросы очень популярны в инвест банкинг домене, и предпочтительный выбор интервьювера, интервьювер опытный Java профессионал.

Если эти вопросы до сих пор спрашивают, это означает что не многие на них отвечают уверено и ясно, как хотелось бы спрашивающему. Это мотивирует меня пересмотреть этот вопрос снова. Чтобы лутше понимать эти вопросы, вы должны хорошо знать equals and hashcode method.

Покрайне мере вы должны знать что:
1) Два неуникальных объекта могут возращать тот же самый hashCode.
2) Когда два объекта равны по equals(), они должны иметь тотже самый hashcode.

Как get метод Hashtable работает в Java.

Я так же предлагаю читать equals and hashcode главу из книги Эффективная Java для заполнения своих пробелов. К стати по этой причине, требования для ключевого объекта в HashMap реализации обоих equals() и hashCode(), и правда что этот вопрос является одним из самых популярных среди опытных Java-программистов, спрашивающих какие требования для объектов используемых в качестве ключа в hash коллекциях таких как HashMap, Hashtable, и ConcurrentHashMap.

Другим не обязательным, но стоит отметить требованием для ключей в основанной на hash'ах коллекциях есть Immutable object (неизменяемый объект как String). Помня эти знания наряду с основными знаниями о hash алгоритме, которые вращаются вокруг hash функции.

Вам нужно прочитать правильную книгу о структурах данных и алгоритмах изучить больше об как хеш функция работает и различные стратегии обработки коллизий в Java. Одной из таких книг является Introduction to Algorithms by Thomas Cormen  идеально подходит для программистов которые интересуются более глубоким знаниями про алгоритмы и структуры данных.


Во всяком случае давайте эти вопросы посмотрим снова:

1) Как get(Key key) метод работает внутри HashMap, и Hashtable в Java?
Шаги которые происходят когда вы вызываете get() метод с объектом ключом получить соответствующее значение из hash коллекции.


а) Key.hashCode() метод используется для нахождения бакет локации в бакет массиве. (Помните HashMap есть массив бакетов в Java) хотя hashcode () не используется непосредственно, но они передаются внутренней hash() функции.

б) В бакет массиве или лучше известной как бакет, ключ и значение хранятся в форме вложенного класса называемого Entry.



Источник

Комментариев нет:

Отправить комментарий