Це буде довга відповідь, випити напій і прочитати далі ...
Хешинг - це все, що потрібно зберегти пару ключових значень у пам'яті, яку можна прочитати та записати швидше. Він зберігає ключі в масиві і значення у 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 індекси масиву, тим самим збільшуючи доступ до даних.
Але, зачекайте, одну секунду. У цьому пов'язаному списку відповідного масиву індексу 1 є 3 значення, як з’ясовується, яке було значенням для ключових «лошадей»?
Насправді я збрехав, коли сказав, що 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 з «кінчиками», а коли він знаходить, він просто повертає значення його.
Сподіваюся, вам було весело, читаючи його :)