W Jaki Sposób Java porządkuje elementy w Hashmapie lub tabeli HashTable?
Zastanawiałem się jak Java zamawia przedmioty w Map
(HashMap
lub Hashtable
) po ich dodaniu. Są kluczami uporządkowanymi według hashcode, referencji pamięci lub według pierwszeństwa przydziału...?
To dlatego, że zauważyłem, że te same pary w Map
nie zawsze są w tej samej kolejności
7 answers
java.util.HashMap
nie możecie i nie powinniście zakładać niczego poza tym.
Klasa ta nie daje żadnych gwarancji co do kolejności mapy; w szczególności nie gwarantuje, że kolejność pozostanie stała w czasie.
java.util.LinkedHashMap
używa kolejności wstawiania.
Ta implementacja różni się od
HashMap
tym, że utrzymuje podwójnie połączoną listę biegnącą przez wszystkie jej wpisy. Ta powiązana lista definiuje kolejność iteracji, zwykle jest to kolejność, w jakiej klucze zostały wstawione do mapy (kolejność wstawiania).
java.util.TreeMap
, a SortedMap
, wykorzystuje naturalne lub niestandardowe zamawianie kluczy.
Mapa jest sortowana według naturalnej kolejności jej kluczy lub według
Comparator
podanej w czasie tworzenia mapy, w zależności od używanego konstruktora.
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
2010-05-12 10:04:55
Po pierwsze: HashMap
konkretnie nie zapewnia stabilnego i/lub zdefiniowanego porządku. Więc wszystko, co zaobserwujesz, jest po prostu szczegółem implementacji i nie możesz od niej w żaden sposób zależeć.
Ponieważ czasami warto znać przyczynę pozornie przypadkowego zamówienia, oto podstawowa idea:
A HashMap
posiada liczbę kubełków (zaimplementowanych jako tablica), w których można przechowywać wpisy.
Gdy element zostanie dodany do mapy, zostanie przypisany do wiadra na podstawie wartości uzyskanej z jej hashCode
i wielkości wiadra HashMap
. (Zauważ, że możliwe jest, że wiadro jest już zajęte, co nazywa się kolizją. To jest obsługiwane wdzięcznie i poprawnie, ale zignoruję tę obsługę dla opisu, ponieważ nie zmienia to koncepcji).
Postrzegana kolejność entrów (np. zwracana przez iterację nad Map
) zależy od kolejności wpisów w tych wiadrach.
Ilekroć rozmiar jest zmieniany (ponieważ Mapa przekroczyła swój próg pełności), wtedy zmienia się liczba łyżek, co oznacza, że pozycja każdego elementu może się zmienić, ponieważ pozycja łyżki pochodzi również od liczby łyż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
2010-05-12 10:18:30
HashMap
nie sortuje w ogóle. Dla mapy sortującej według wartości klucza należy użyć TreeMap
.
From the JavaDocs for TreeMap
:
Czerwono-czarne drzewo oparte na implementacji interfejs SortedMap. Ta klasa gwarantuje, że mapa będzie w rosnąca kolejność klawiszy, posortowane według do naturalnego porządku dla klucza klasy (patrz porównywalne), lub przez komparator dostarczony w czasie tworzenia, w zależności od tego, który konstruktor jest używany.
Z dokumentacja HashMap
:
Ta klasa nie daje żadnych gwarancji co do kolejność mapy; w szczególności, nie gwarantuje, że zamówienie pozostanie stała w czasie.
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
2010-05-12 10:03:13
A Map
nie jest uporządkowaną strukturą danych - nie należy polegać na tym, że wpisy w HashMap
są w określonej kolejności. Niektóre implementacje Map
, takie jak LinkedHashMap
i TreeMap
gwarantują pewną kolejność, ale HashMap
nie gwarantuje.
Jeśli naprawdę chcesz wiedzieć, co dzieje się wewnętrznie, Wyszukaj kod źródłowy HashMap
- możesz go znaleźć w src.zip , który powinien znajdować się w katalogu instalacyjnym JDK.
A HashMap
posiada pewną liczbę "wiader", w których przechowuje swoje wpisy. Które bucket wpis jest przechowywany jest określony przez kod hash klucza wpisu. Kolejność wyświetlania wpisów w HashMap
zależy od kodów skrótu kluczy. Ale nie pisz programów, które polegają na tym, że wpisy są w określonej kolejności w HashMap
- implementacja może się zmienić w przyszłej wersji Javy i twój program nie będzie już działał.
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
2010-05-12 10:03:31
Hashmap ma nie zdefiniowaną kolejność elementów
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
2010-05-12 10:04:38
Nie ma zdefiniowanej kolejności w tabeli hash. Klucze są umieszczane w gnieździe, na podstawie kodu hash, ale nawet to nie jest trywialne kolejność po kodzie hash.
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
2010-05-12 10:03:34
HashMap przechowuje wartości za pomocą unikalnej wartości hash Wygenerowanej za pomocą części klucza. Ta wartość skrótu mapuje adres, w którym ma być przechowywana. W ten sposób zapewnia dostęp O(1).
LinkedHashmap z drugiej strony zachowuje kolejność dodawania do mapy.
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
2010-05-12 10:13:19