Принцип работы HashMap является общим вопросом на интервью на Java в последние годы. Почти каждый программист Java знает HashMap, знает, где использовать HashMap, и знает разницу между хэштетом и хэшмапом. Так почему же этот вопрос интервью такой особенный? Это потому, что этот вопрос очень глубокий. Этот вопрос часто появляется в продвинутых или средних интервью. Инвестиционные банки предпочитают задавать этот вопрос и могут даже попросить вас внедрить HashMap для изучения ваших навыков программирования. Введение concurrenthashmap и других синхронных наборов делает эту проблему более сложной. Давайте начнем исследование!
Давайте сначала зададут несколько простых вопросов
"Вы использовали Hashmap?" «Что такое хэшмап? Почему вы его использовали?»
Почти все будут отвечать «да», а затем отвечают на некоторые функции HashMap, такие как HashMap, могут принимать значения и значения ключей нулевых, в то время как хэштата не может; HashMap не синхронизирован; HashMap быстрая; и HashMap сохраняет пары ключевых значений и т. Д. Но интервьюер быстро повернулся и с этого момента начал задавать несколько сложных вопросов о более основных деталях hashmap. Интервьюер может задать следующие вопросы:
"Вы знаете, как работает hashmap?" «Вы знаете, как работает метод hashmap () get ()?»
Вы можете ответить: «Я не смотрел стандартный Java API подробно, вы можете посмотреть на исходный код Java или открыть JDK». «Я могу найти ответ с Google».
Но некоторые интервьюеры могут дать ответ: «Hashmap основан на принципе хэширования. Мы используем Put (Key, значение) для хранения объектов в Hashmap и используем Get (Key), чтобы получить объекты из HashMap. Когда мы передаем ключи и значения в метод POT (), мы сначала называем метод HashCode () на ключе, а возвращаемый кодовый код используется, чтобы найти место для поиска нагрузки, чтобы найти нагрузокует. Ключевой момент здесь состоит в том, чтобы указать, что HASHMAP сохраняет ключевые объекты и объекты значения в ведре как map.Entry. Это помогает понять логику получения объектов. Если вы не осознаете этого или по ошибке думаете, что вы просто храните значения в ведрах, вы не ответите на логику, как получить объекты из HashMap. Этот ответ довольно правильный, и он также показывает, что интервьюер знает хешинг и как работает хэшмап. Но это только начало истории. Когда интервьюер присоединяется к некоторым фактическим сценам, с которыми программисты Java должны сталкиваться каждый день, часто появляются неправильные ответы. Следующий вопрос может быть связан с обнаружением столкновений в HashMap и решении столкновения:
«Что происходит, когда хешкод двух объектов одинаково?» Отсюда начинается реальная путаница, и некоторые интервьюеры отвечают, что, поскольку хешкод одинаково, два объекта равны, а HashMap будет выдвинуть исключения, иначе они не будут храниться. Тогда интервьюер может напомнить им, что есть два метода: equals () и hashcode () и сказать им, что даже если хэшкод одинаков, они могут не быть равными. Некоторые интервьюеры могут сдаться, в то время как другие могут продолжать продвигаться. Они ответили: «Поскольку хешкод одинаково, их положение ведра одинакова, и произойдет« столкновение ». Поскольку Hashmap использует связанный список для хранения объектов, эта запись (объект Map.Entry, содержащий пары ключевых значений), будет сохранена в связанном списке». Этот ответ очень разумный. Хотя есть много способов справиться с столкновениями, этот метод является самым простым, и это метод обработки HashMap. Но история еще не закончена, и интервьюер продолжит спрашивать:
«Если хешкод двух клавиш одинаково, как вы получаете объект значения?» Интервьюер ответит: когда мы вызовут метод get (), HashMap будет использовать хэшкод объекта ключа, чтобы найти местоположение ковша, а затем получить объект значения. Интервьюер напоминает ему, что если два объекта значения хранятся в одном и том же ведре, он дает ответ: связанный список будет пройдене до тех пор, пока объект Value не будет найден. Интервьюер спросит, потому что у вас нет объекта значения для сравнения, как вы определили, нужно ли найти объект значения? Если интервьюер не хранит пары ключевых значений в связанном списке, пока HashMap не хранит их в связанном списке, они не смогут ответить на этот вопрос.
Некоторые из интервьюеров, которые помнят эту важную точку знания, скажут, что после поиска локации ведра они будут вызвать метод keys.equals (), чтобы найти правильный узел в связанном списке и, наконец, найти объект значения, который будет найден. Идеальный ответ!
Во многих случаях интервьюеры будут делать ошибки в этой ссылке, потому что они путают методы HashCode () и Equals (). Потому что до этого HashCode () появляется многократно, и метод equals () появляется только при получении объекта значения. Некоторые превосходные разработчики указывают на то, что использование неизменных, объявленных объектов как окончательные, и использование соответствующих методов Equals () и hashcode () снизит возникновение столкновений и повысит эффективность. Необвишаемость позволяет кэшировать хешкод разных ключей, что увеличит скорость получения всего объекта. Использование классов обертки, таких как String и Interger в качестве клавиш, является очень хорошим выбором.
Если вы думаете, что это здесь, вы будете удивлены, когда услышите следующий вопрос. «Что если размер хэшмапа превышает емкость, определенную коэффициентом нагрузки?» Если вы действительно не знаете, как работает HashMap, вы не ответите на этот вопрос. Размер коэффициента нагрузки по умолчанию составляет 0,75. То есть, когда карта заполняет 75% ведра, как и другие классы сбора (например, ArrayList и т. Д.), Массив ведра, который в два раза превышает размер исходного HashMap, будет создан для изменения размера карты и поместить исходный объект в новый массив ведра. Этот процесс называется перефразированием, потому что он называет хэш -метод, чтобы найти новое местоположение ведра.
Если вы можете ответить на этот вопрос, возникает следующий вопрос: «Вы понимаете, какие проблемы существуют в изменении размера Hashmap?» Вы не сможете ответить на это. В настоящее время интервьюер напомнит вам, что при многопоточном состоянии может быть условие гонки.
При изменении размера HashMap действительно существует условная конкуренция, потому что, если оба потока обнаруживают, что HashMap необходимо изменить размер, они попытаются изменить размер одновременно. Во время процесса изменения размера порядок элементов, хранящихся в связанном списке, будет изменен, потому что при перемещении в новое положение ведра HashMap не помещает элементы в конце связанного списка, а в голове, который должен избежать прохождения хвоста. Если происходит условное соревнование, то существует порочный цикл. В настоящее время вы можете спросить интервьюера, почему это так странно, что вам нужно использовать HashMap в многопоточной среде? :)
Читатели с энтузиазмом вносят больше вопросов о HashMap:
1. Почему классы обертки, такие как строка и интернет, подходят в качестве ключей? Класс обертки, такой как строка и интернет, наиболее подходящий в качестве ключа HashMap, а строка наиболее часто используется. Потому что строка неизменна и окончательна, а методы equals () и hashcode () были переписаны. Другие классы обертки также имеют эту функцию. Необходимость необходима, потому что для расчета HashCode () вы должны предотвратить изменение значения ключа. Если значение ключа возвращает другой хешкод при внедрении и получении, вы не можете найти объект, который вы хотите, от HashMap. Необываемость имеет другие преимущества, такие как безопасность потоков. Если вы можете гарантировать, что хэшкод не изменился, просто объявив поле окончательным, пожалуйста, сделайте это. Поскольку методы equals () и hashcode () используются при получении объектов, очень важно правильно переписать эти два метода. Если два неравных объекта возвращают разные хэшкоды, вероятность столкновения будет меньше, что может улучшить производительность HashMap.
2. Можем ли мы использовать пользовательские объекты в качестве ключей? Это расширение предыдущего вопроса. Конечно, вы можете использовать любой объект в качестве ключей, если он следует методам определения equals () и hashcode () и не будет изменяться снова после того, как объект вставлен в карту. Если этот пользовательский объект неизменен, то он уже удовлетворяет условию как ключ, потому что его нельзя изменить после его создания.
3. Можем ли мы использовать Cocurrenthashmap, чтобы заменить хэш -сайте? Это еще один очень популярный вопрос для интервью, потому что все больше и больше людей используют concurrenthashmap. Мы знаем, что хэштата синхронизирован, но синхронизация concurrenthashmap лучше, потому что она блокирует часть карты на основе уровня синхронизации. Concurrenthashmap, безусловно, может заменить хэш -образную, но Hashtable обеспечивает более сильную безопасность резьбы. Проверьте этот блог, чтобы увидеть разницу между хэштибельными и concurrenthashmap.
Мне лично нравится этот вопрос, потому что глубина и широта этого вопроса не связаны с разными понятиями. Давайте посмотрим на то, что предназначены знания о разработке этих вопросов:
Суммировать
Как работает хэшмап
HashMap основан на принципе хеширования, и мы храним и получаем объекты через методы put () и get (). Когда мы передаем пару ключевых значений методу put (), он вызывает метод HashCode () объекта ключа для вычисления хэшкода, а затем находит положение о ковше для хранения объекта значения. При получении объекта правильная пара ключевых значений обнаруживается с помощью метода Equals () ключевого объекта, а затем возвращается объект значения. HashMap использует связанные списки для решения проблемы столкновения. Когда происходит столкновение, объект будет храниться в следующем узле связанного списка. HashMap сохраняет объекты пары ключей в каждом связанном списке.
Что происходит, когда хешкод двух разных ключевых объектов одинаково? Они будут храниться в связанном списке в том же месте ведра. Метод equals () объекта ключа используется для поиска паров ключевых значений.
Поскольку HashMap имеет много преимуществ, я использовал HashMap в качестве кэша в приложениях электронной коммерции. Поскольку Java много используется в финансовой сфере, и для соображений эффективности мы часто используем HashMap и COMPURRENTHASHMAP. Вы можете просмотреть больше статей о HashMap:
Разница между HashMap и Hashtable
Разница между HashMap и Hashset
Оригинальная ссылка: javarevisited Перевод: ImportNew.com - Tang Xiaojuan Ссылка на перевод: http://www.importnew.com/7099.html