Если кто -нибудь позволит мне описать рабочий механизм хэш -карты, я просто отвечу: «правила на основе хеш». Это предложение очень простое, но перед пониманием этого предложения мы должны сначала понять, что это так, не так ли?
Что такое Бех
Хэш - это просто уникальная строка, полученная после того, как атрибут переменной/объекта применяется к определенному алгоритму, и эта строка используется для определения уникальности переменной/объекта. Правильная хэш -функция должна соблюдать этот критерий.
Когда функция хеш применяется к одному и тому же объекту или равный объект, каждое выполнение должно вернуть одно и то же значение. Другими словами, два равных объекта должны иметь одинаковый хэшкод.
Примечание. Все объекты Java наследуют метод HashCode () по умолчанию из класса объекта. Этот метод возвращает адрес объекта в памяти как целое число.
Одно введение в класс входа
Определение карты: объект из ключа отображения до значения. Очень просто, верно?
Следовательно, в HashMap должен быть определенный механизм для хранения этих парам ключевых значений. Make HashMap имеет внутреннюю запись класса, которая выглядит так.
Статическая запись класса <, V> реализует карту.
Конечно, класс записи имеет атрибуты для хранения значений ключей. Ключ отмечен окончательным. Далее мы пытаемся понять значение этих переменных.
Что на самом деле делает метод put ()?
Прежде чем посмотреть на реализацию метода POT, необходимо взглянуть на хранение экземпляра входа в массиве.
/ ** * ТАБЛИЦА, ПРИМЕНЕНИЕ АСИЛЕССА. /*** связывает указанное значение с указанным ключом в этой карте.* Если карта, ранее содержащая для ключа, старое значение* CED. Значение значения связано с ключом указания* @return предыдущее значение, связанное с </tt>, или* <tt> null </tt>, если Eer e /tt>.* (a <tt> null </tt> Возврат может также указать, что карта* ранее ассоциация <TT> null </tt> key </tt>.)*/Public v Put (k Key, значение) {if (key == null) return putfornullkey (значение); int hash = hast (key.hashcode ()); && (k = e.key) == Ключ. , ключ, все);
Давайте посмотрим шаг за шагом
Прежде всего, проверьте, является ли ключ нулевой.
Далее, значение этого ключа рассчитывается с помощью метода HashCode (), который используется для расчета позиции в массиве объекта входа. Дизайнер JDK предполагает, что некоторые люди могут писать очень плохие методы хэшкода (), и будут некоторые очень большие или очень маленькие хэш -значения. Чтобы решить эту проблему, они ввели еще одну хэш -функцию, чтобы принять хэшкод () объекта и преобразовать ее в способность массива.
Далее находится метод Indexfor (хэш, таблица, длина), который вычисляет точное местоположение хранилища объекта входа.
Далее является основной частью.
Ответ - LinkedList. Если вы помните, класс записи имеет следующую переменную, эта переменная всегда указывает на следующую переменную в цепочке, которая полностью соответствует характеристикам связанного списка.
Поэтому, когда происходит столкновение, объект входа будет храниться в форме связанного списка. Текущий объект входа используется в качестве следующего узла объекта входа, который был сохранен.
Что если мы сохраним существующий ключ в другом значении? Логически, старое значение будет заменено. После обнаружения позиции хранения объекта входа HashMap будет пройти связанный список ввода в эту позицию. Если вы обнаружите, что метод равных равен, замена выполняется.
Таким образом, HashMap может обеспечить уникальность ключа.
Механизм работы метода получения
Теперь мы выучили механизм хранения, который в Hashmap, приведенный в хранение. Следующий вопрос: как запросить результаты из хэшмапы.
Фактически, логика такая же, как и пут.
/*** Возвращает значение, на которое отображается клавиша указания,* или {@code null}, если эта карта не содержит отображения для ключа. * {@code k} до значения {@code v} такое, что {@code (key == null? k == null:* key.equals (k)}, тогда этот метод возвращает {@code v}; o Это возвращает {@code null}. используется для* различать два случая. ); = Ключ ||.
Приведенный выше код выглядит аналогично методу put (), за исключением случаев, если (e.hash == hash && ((k = e.key) == key || key.equals (k))).
Обращать внимание