Это будет длинный ответ, выпейте и читайте дальше ...
Хеширование - это все о хранении пары ключ-значение в памяти, которая может быть прочитана и записана быстрее. Он хранит ключи в массиве, а значения - в 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
. который является вторым элементом массива.
а значение «ахан» сохраняется в LinkedList, связанном с индексом массива 1.
HashCollision. Если вы попытаетесь найти hasHCode
ключей “misused”
и “horsemints”
, используя формулы, описанные выше, вы увидите, что оба дают нам одинаковые 1069518484
. Ого !! урок выучен -
2 одинаковых объекта должны иметь одинаковый хэш-код, но нет гарантии, что если хэш-код совпадает, то объекты равны. Таким образом, в ведре 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 значения, соответствующие индексу массива 1, как определить, какое из них было значением для ключа «horsemints»?
На самом деле я соврал, когда сказал, что 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 с «конскими мельницами», и когда он находит его, он просто возвращает его значение.
Надеюсь, вам понравилось читать это :)
person
sapy
schedule
20.03.2016