Jak HashTable i HashMap key-value są przechowywane w pamięci?
Rozumiem, że do klucza stosuje się technikę hashowania, która przechowuje jego wartość w adresie pamięci.
Ale nie rozumiem Jak tu się dzieje kolizja ? Jakiego algorytmu haszującego używa Java do tworzenia przestrzeni pamięci ? Czy to MD5?
4 answers
Podstawowa idea HashMap
jest taka:
- A {[0] } jest tak naprawdę tablicą specjalnych obiektów, które przechowują zarówno Klucz, jak i wartość.
- tablica ma pewną ilość wiader (slotów), powiedzmy 16.
- algorytm haszujący jest dostarczany przez metodę
hashCode()
, którą posiada każdy obiekt. Dlatego pisząc nowąClass
, Należy zadbać o właściwą implementację metodhashCode()
iequals()
. Domyślna (z klasyObject
) przyjmuje wskaźnik pamięci jako liczbę. Ale to nie jest dobre dla większości klas, z których chcielibyśmy korzystać. Na przykład klasaString
używa algorytmu, który tworzy hash ze wszystkich znaków w łańcuchu-pomyśl o tym w następujący sposób:hashCode = 1.char + 2.char + 3.char...
(uproszczone). Dlatego dwa równe ciągi, mimo że znajdują się w innym miejscu w pamięci, mają ten samhashCode()
. - wynikiem
hashCode()
, powiedzmy "132", jest wtedy liczba wiadra, w którym obiekt powinien być przechowywany, jeśli mamy tak dużą tablicę. Ale my nie, nasz ma tylko 16 wiadrów. Więc my użyj oczywistych obliczeń'hashcode % array.length = bucket'
lub'132 mod 16 = 4'
i zapisz parę klucz-wartość w wiadrze numer 4. - Jeśli nie ma jeszcze innej pary, jest ok.
- jeśli istnieje jeden z kluczem równym kluczowi, który mamy, usuwamy Stary.
- jeśli jest inna para klucz-wartość (kolizja), łączymy nową za starą do połączonej listy.
- jeśli tablica zapasowa stanie się zbyt pełna, więc będziemy musieli zrobić zbyt wiele połączonych list, tworzymy nową tablicę z podwojoną długością, ponownie dodajemy wszystkie elementy do nowej tablicy, a następnie usuwamy starą. Jest to najprawdopodobniej najdroższa operacja na
HashMap
, więc chcesz powiedzieć swojemuMaps
, ile łyżek użyjesz, jeśli znasz je wcześniej. - jeśli ktoś próbuje uzyskać wartość, podaje klucz, mieszamy go, modyfikujemy, a następnie przechodzimy przez potencjalną listę połączoną dla dokładnego dopasowania.
Zdjęcie dzięki uprzejmości Wikipedii:
W tym case,
- istnieje tablica z 256 wiadrami (numerowanymi, oczywiście, 0-255) Jest pięć osób. Ich hashcody, po umieszczeniu przez
- widać, że Sandra Dee nie miała wolnego miejsca, więc została przykuta do Johna Smitha.
mod 256
, wskazują na cztery różne sloty w tablicy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-26 16:14:13
Tutaj Hash
nie oznacza dla Hashing
techniki takie jak MD5 . To HashCode miejsca pamięci używanego do przechowywania Object
dla określonego klucza.
Odczyty:
To jest nieco jaśniejsze wyjaśnienie, jak działa HashMap?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:34
Jako domyślna implementacja hashCode()
funkcja w klasie Object
zwraca adres pamięci jako hash używany jako klucz w HashTable
& HashMap
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-20 08:29:57
Po przejrzeniu odpowiedzi @Slanec, zobacz javadoc z Java-8, ponieważ są znaczące zmiany. Na przykład: "TREEIFY", gdzie LinkedList jest konwertowana na mapę drzewa w przypadku osiągnięcia progu liczby wpisów na wiadro (obecnie 8).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 19:44:38