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?

Author: Andy, 2012-06-05

4 answers

Podstawowa idea HashMap jest taka:

  1. A {[0] } jest tak naprawdę tablicą specjalnych obiektów, które przechowują zarówno Klucz, jak i wartość.
  2. tablica ma pewną ilość wiader (slotów), powiedzmy 16.
  3. 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ę metod hashCode() i equals(). Domyślna (z klasy Object) 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 klasa String 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 sam hashCode().
  4. 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.
  5. jeśli istnieje jeden z kluczem równym kluczowi, który mamy, usuwamy Stary.
  6. jeśli jest inna para klucz-wartość (kolizja), łączymy nową za starą do połączonej listy.
  7. 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ć swojemu Maps, ile łyżek użyjesz, jeśli znasz je wcześniej.
  8. 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: Grafika

W tym case,

  • istnieje tablica z 256 wiadrami (numerowanymi, oczywiście, 0-255)
  • Jest pięć osób. Ich hashcody, po umieszczeniu przez mod 256, wskazują na cztery różne sloty w tablicy.
  • widać, że Sandra Dee nie miała wolnego miejsca, więc została przykuta do Johna Smitha.
Jeśli spróbowałbyś znaleźć numer telefonu Sandry Dee, podałbyś jej nazwisko, zmodyfikował do 256 i zajrzał do wiadra 152. Tam znajdziesz Johna Smith. To nie Sandra, spójrz dalej ... jest Sandra przykuta łańcuchem za Johnem.
 40
Author: Petr Janeček,
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?

 4
Author: Asif,
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.

 1
Author: ejb_guy,
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).

 0
Author: Biman Tripathy,
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