Ответ будет длинным, выпей и читай дальше ...
Хеширование - это сохранение пары ключ-значение в памяти, которая может быть прочитана и записана быстрее. Он хранит ключи в массиве и значения в LinkedList.
Скажем, я хочу сохранить 4 пары ключ-значение -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Поэтому для хранения ключей нам нужен массив из 4 элементов. Теперь, как мне сопоставить один из этих 4 ключей с 4 индексами массива (0,1,2,3)?
Таким образом, Java находит хэш-код отдельных ключей и сопоставляет их с определенным индексом массива. Hashcode Formulas - это
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
Хэш и девушка !! Я знаю, что вы думаете. Ваше увлечение этим диким дуэтом может заставить вас упустить важную вещь.
Почему ява умножает это на 31?
Это потому, что 31 - нечетное простое число в форме 2 ^ 5 - 1. И нечетное простое число уменьшает вероятность хеш-коллизии
Теперь, как этот хэш-код отображается на индекс массива?
ответ Hash Code % (Array length -1)
. Так“girl”
сопоставлено (3173020 % 3) = 1
в нашем случае. который является вторым элементом массива.
и значение «ахан» сохраняется в 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 с «скачками», и когда он находит его, он просто возвращает его значение.
Надеюсь, вам было весело читать это :)