Ответ будет длинным, выпей и читай ...
Хеширование - это сохранение пары ключ-значение в памяти, которая может быть прочитана и записана быстрее. Хранит ключи в массиве и значения в LinkedList.
Скажем, я хочу сохранить 4 пары значений ключа -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Итак, для хранения ключей нам нужен массив из 4 элементов. Теперь, как мне сопоставить один из этих 4 ключей с 4 индексами массива (0,1,2,3)?
Таким образом, java находит хэш-код отдельных ключей и сопоставляет их с определенным индексом массива.
Формулы хэш-кода - -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
Хэш и девушка !! Я знаю, что вы думаете. Ваше увлечение этим диким дуэтом может заставить вас упустить важную вещь.
Почему Java умножить его на 31?
Потому что 31 - нечетное простое число в форме 2 ^ 5 - 1. И нечетное простое число уменьшает вероятность хеш-коллизии
Теперь, как этот хэш-код отображается на индекс массива?
ответ: Hash Code % (Array length -1)
. Таким образом, “girl”
отображается в (3173020 % 3) = 1
в нашем случае. который является вторым элементом массива.
и значение «ahhan» сохраняется в LinkedList, связанном с индексом массива 1.
HashCollision - Если вы попытаетесь найти hasHCode
ключей “misused”
и “horsemints”
, используя формулы, описанные выше, вы увидите, что оба дают нам одинаковые 1069518484
. Воуаа !! извлеченный урок -
2 одинаковых объекта должны иметь одинаковый hashCode, но нет гарантии, что
hashCode соответствует, тогда объекты равны. Так должно храниться
оба значения соответствуют «неправильно использованным» и «мятам» в ведро 1
(1069518484% 3).
Теперь хеш-карта выглядит как -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Теперь, если какое-то тело попытается найти значение для ключа “horsemints”
, java быстро найдет его хеш-код, отредактирует его и начнет поиск его значения в LinkedList, соответствующем index 1
. Таким образом, нам не нужно искать все 4 индекса массива, что ускоряет доступ к данным.
Но, подождите, одну секунду. есть 3 значения в этом LinkList, соответствующем индексу массива 1, как он узнает, какое из них было значением для ключевых «скачек»?
На самом деле я солгал, когда сказал, что HashMap просто хранит значения в LinkedList.
Хранит обе пары ключ-значение в качестве записи карты. Так что на самом деле карта выглядит так.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Теперь вы можете видеть, проходя через связанный список, соответствующий ArrayIndex1, он фактически сравнивает ключ каждой записи в этом LinkedList с «horsemints» и, когда находит его, просто возвращает его значение.
Надеюсь, вам было весело читать это:)