Różnica między HashMap, LinkedHashMap i TreeMap
Jaka jest różnica między HashMap
, LinkedHashMap
i TreeMap
w Javie?
Nie widzę żadnej różnicy w wyjściu, ponieważ wszystkie trzy mają keySet
i values
. Czym są Hashtable
s?
Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet());
print(m1.values());
SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet());
print(sm.values());
LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet());
print(lm.values());
15 answers
Wszystkie trzy klasy implementują interfejs Map
i oferują w większości tę samą funkcjonalność. Najważniejszą różnicą jest kolejność, w jakiej nastąpi iteracja poprzez wpisy:
-
HashMap
nie daje absolutnie żadnych gwarancji co do kolejności iteracji. Może (i będzie) zmieniać się nawet całkowicie po dodaniu nowych elementów. -
TreeMap
będzie iteracją zgodnie z" naturalnym porządkiem " kluczy zgodnie z ich metodącompareTo()
(lub dostarczoną zewnętrznieComparator
). Dodatkowo realizujeSortedMap
interfejs, który zawiera metody zależne od tej kolejności sortowania. -
LinkedHashMap
będzie powtarzał się w kolejności, w jakiej wpisy zostały umieszczone na mapie
"Hashtable" to ogólna nazwa map opartych na hash. W kontekście Java API,
Hashtable
jest przestarzałą klasą z czasów Javy 1.1, zanim istniał Framework collections. Nie powinno być już używane, ponieważ jego API jest zaśmiecone przestarzałymi metodami ta zduplikowana funkcjonalność i jej metody są zsynchronizowane (co może zmniejszyć wydajność i jest ogólnie bezużyteczne). Użyj ConcurrentHashMap zamiast Hashtable.
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
2018-02-05 01:32:26
Wolę prezentację wizualną:
╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║ Property ║ HashMap ║ TreeMap ║ LinkedHashMap ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Iteration ║ no guarantee order ║ sorted according ║ ║
║ Order ║ will remain constant║ to the natural ║ insertion-order ║
║ ║ over time ║ ordering ║ ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Get/put ║ ║ ║ ║
║ remove ║ O(1) ║ O(log(n)) ║ O(1) ║
║ containsKey ║ ║ ║ ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ ║ ║ NavigableMap ║ ║
║ Interfaces ║ Map ║ Map ║ Map ║
║ ║ ║ SortedMap ║ ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ ║ ║ ║ ║
║ Null ║ allowed ║ only values ║ allowed ║
║ values/keys ║ ║ ║ ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║ ║ Fail-fast behavior of an iterator cannot be guaranteed ║
║ Fail-fast ║ impossible to make any hard guarantees in the presence of ║
║ behavior ║ unsynchronized concurrent modification ║
╠══════════════╬═════════════════════╦═══════════════════╦═════════════════════╣
║ ║ ║ ║ ║
║Implementation║ buckets ║ Red-Black Tree ║ double-linked ║
║ ║ ║ ║ buckets ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║ Is ║ ║
║ synchronized ║ implementation is not synchronized ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝
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
2018-04-04 05:34:08
Wszystkie trzy reprezentują mapowanie z unikalnych kluczy do wartości, a zatem implementują interfejs Map .
HashMap jest mapą opartą na hashowaniu kluczy. Obsługuje operacje o (1) get/put. Klucze muszą mieć spójne implementacje
hashCode()
iequals()
żeby to zadziałało.LinkedHashMap jest bardzo podobny do HashMap, ale dodaje świadomość do kolejności, w której elementy są dodawane (lub dostępne) , więc kolejność iteracji jest taka sama jak kolejność wstawiania (lub kolejność dostępu, w zależności od parametrów konstrukcyjnych).
TreeMap jest mapowaniem opartym na drzewie. Jego operacje put/get zajmują czas o (log n). Wymaga to, aby elementy miały jakiś mechanizm porównawczy, albo z porównywalnym, albo porównawczym. Kolejność iteracji jest określona przez ten mechanizm.
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-07-30 11:48:15
Zobacz, gdzie każda klasa znajduje się w hierarchii klas na poniższym diagramie (większy ). TreeMap implementuje SortedMap
i NavigableMap
, podczas gdy HashMap
nie.
HashTable
jest przestarzały i należy użyć odpowiedniej klasy ConcurrentHashMap
.
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-01-10 21:11:51
HashMap
- ma wartości pary (klucze,wartości)
- Brak wartości klucza duplikacji
- nieuporządkowane niesortowane
- pozwala na jeden klucz null i więcej niż jedną wartość null
HashTable
- tak samo jak hash map
- nie pozwala na klucze null i wartości null
LinkedHashMap
- jest to uporządkowana wersja implementacji map
- na podstawie połączonych list i danych hashujących struktury
TreeMap
- Wersja uporządkowana i sortowana
- na podstawie haszujących struktur danych
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-07-30 11:52:30
Tylko trochę więcej informacji z mojego własnego doświadczenia z mapami, kiedy używam każdej z nich:
- HashMap - najbardziej przydatny przy szukaniu najlepszej (szybkiej) implementacji.
- TreeMap (SortedMap interface) - najbardziej przydatne, gdy chodzi o możliwość sortowania lub iteracji kluczy w określonej kolejności, którą definiuję.
- LinkedHashMap-łączy zalety gwarantowanego zamawiania z mapy drzewa bez zwiększonych kosztów utrzymania mapy drzewa. (Jest prawie tak szybki jak HashMap). W szczególności, LinkedHashMap zapewnia również świetny punkt wyjścia do tworzenia obiektu pamięci podręcznej poprzez nadpisanie
removeEldestEntry()
metoda. Umożliwia to utworzenie obiektu pamięci podręcznej, który może wygasać dane przy użyciu określonych kryterió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
2013-04-25 18:30:09
Wszystkie trzy klasy HashMap
, TreeMap
and LinkedHashMap
implementuje interfejs java.util.Map
i reprezentuje mapowanie z unikalnego klucza do wartości.
A
HashMap
zawiera wartości oparte na kluczu.Zawiera tylko unikalne elementy.
Może mieć jeden klucz null i wiele wartości null.
-
Utrzymuje nie. zamówienie.
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
- a
LinkedHashMap
zawiera wartości oparte na kluczu. - zawiera tylko unikalne elementy.
- może mieć jeden klucz null i wiele wartości null.
-
Jest taki sam jak HashMap zamiast tego utrzymuje kolejność wstawiania. //Patrz Klasa opóźnienia poniżej
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
- A
TreeMap
zawiera wartości oparte na kluczu. Implementuje interfejs NavigableMap i rozszerza klasę AbstractMap. - zawiera tylko unikalne elementy.
- nie może mieć klucza null, ale może mieć wiele wartości null.
-
Jest taka sama jak
HashMap
zamiast tego utrzymuje kolejność rosnąca(sortowane według naturalnego porządku klucza.).public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
- Hashtable jest tablicą listy. Każda lista jest znany jako wiadro. Pozycja bucket jest identyfikowana przez wywołanie metody hashcode (). Hashtable zawiera wartości oparte na kluczu.
- zawiera tylko unikalne elementy.
- może nie mieć żadnego klucza ani wartości null.
- jest zsynchronizowane.
-
Jest klasą dziedziczną.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
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-07-29 13:16:33
HashMap nie daje absolutnie żadnych gwarancji co do kolejności iteracji. Informatyka może (i będzie) zmieniać się nawet całkowicie po dodaniu nowych elementów. Mapa drzewa będzie iteracją zgodnie z" naturalną kolejnością " kluczy zgodnie z ich metodą compareTo () (lub dostarczaną zewnętrznie Komparator). Dodatkowo implementuje interfejs SortedMap, który zawiera metody, które zależą od tego porządku sortowania. LinkedHashMap będzie iteracją w kolejności, w jakiej wpisy zostały umieszczone w mapa
Zobacz, jak różna jest wydajność..
Mapa drzewa, która jest implementacją Mapy posortowanej. Złożoność operacji put, get i containsKey wynosi O (log n) ze względu na naturalną kolejność
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-09-28 17:29:32
@ Amit: SortedMap
jest interfejsem, podczas gdy {[2] } jest klasą implementującą interfejs SortedMap
. Oznacza to, że jeśli postępuje zgodnie z protokołem, który SortedMap
prosi o to jego implementatorów.
Drzewo, o ile nie jest zaimplementowane jako drzewo wyszukiwania, nie może podać uporządkowanych danych, ponieważ drzewo może być dowolnym rodzajem drzewa. Tak więc, aby TreeMap działał jak posortowany porządek, implementuje SortedMap (np. binarne drzewo wyszukiwania-BST, zbalansowane drzewo wyszukiwania jak AVL i R-B Tree, nawet trójkowe drzewo wyszukiwania-najczęściej używane do iteracyjnych wyszukiwań w uporządkowany sposób ).
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable
W skorupie orzecha
HashMap
: podaje dane w O(1), no ordering
TreeMap
: podaje dane w o (log N), baza 2. z zamówionymi kluczami
LinkedHashMap
: jest tabelą Hashową z listą linkowaną (pomyśl o indexed-SkipList) umożliwiającą przechowywanie danych w sposób, w jaki są one wstawiane do drzewa. Najlepiej nadaje się do wdrożenia LRU(ostatnio używane).
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
2013-09-22 21:46:03
Są to różne implementacje tego samego interfejsu. Każda implementacja ma pewne zalety i wady (szybkie wstawianie, powolne wyszukiwanie) lub odwrotnie.
Aby uzyskać szczegóły, spójrz na javadoc z TreeMap, HashMap, LinkedHashMap .
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-22 21:12:23
Poniżej znajdują się główne różnice między HashMap i TreeMap
-
HashMap nie utrzymuje żadnego porządku. Innymi słowy , HashMap nie daje żadnej gwarancji, że element wstawiony jako pierwszy zostanie wydrukowany jako pierwszy, gdzie podobnie jak TreeSet , Elementy TreeMap są również sortowane zgodnie z naturalną kolejnością jego elementów
Wewnętrzna implementacja HashMap używa hashowania i TreeMap wewnętrznie używa Czerwono-czarnego drzewa wdrożenie.
HashMap może przechowywać jeden klucz null i wiele wartości null.Mapa drzewa nie może zawierać kluczy null, ale może zawierać wiele wartości null.
HashMap przyjmuje stałą wydajność czasu dla podstawowych operacji, takich jak get I put i. e O (1).Zgodnie z dokumentami Oracle , TreeMap zapewnia gwarantowany koszt czasu log (n) dla metody get I put.
HashMap jest znacznie szybszy niż mapa drzewa, ponieważ czas działania HashMap jest stały w stosunku do mapy drzewa dziennika dla większości operacji.
HashMap używa metody equals() w porównaniu, podczas gdy TreeMap używa metody compareTo () do utrzymywania porządku.
HashMap implementuje interfejs mapy, podczas gdy TreeMap implementuje interfejs NavigableMap.
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-12-07 09:16:11
Hash map nie zachowuje kolejności wstawiania.
Przykład. Hashmap
Jeśli wstawiasz klucze jako
1 3
5 9
4 6
7 15
3 10
Może przechowywać go jako
4 6
5 9
3 10
1 3
7 15
Linked Hashmap zachowuje kolejność wstawiania.
Przykład.
Jeśli wstawiasz klucze
1 3
5 9
4 6
7 15
3 10
Zapisze go jako
1 3
5 9
4 6
7 15
3 10
Tak samo jak wstawiamy.
Mapa drzewa przechowuje wartości w rosnącej kolejności kluczy.
Przykład.
Jeśli wstawiasz klucze
1 3
5 9
4 6
7 15
3 10
Będzie go przechowywać as
1 3
3 10
4 6
5 9
7 15
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-12-01 22:21:54
Wszystkie oferują mapę klucza - > wartości i sposób iteracji kluczy. Najważniejsze rozróżnienie między zajęcia te to gwarancja czasu i kolejność kluczy.
- HashMap oferuje 0 (1) wyszukiwanie i wstawianie. Jeśli jednak przejdziesz przez klawisze, kolejność klucze są zasadniczo dowolne. Jest on realizowany przez tablicę połączonych list.
- TreeMap oferuje o (log N) wyszukiwanie i wstawianie. Klucze są uporządkowane, więc jeśli potrzebujesz iteracji poprzez klucze w uporządkowany porządek, możesz. Oznacza to, że klucze muszą zaimplementować porównywalny interfejs.Mapa drzewa jest realizowana przez czerwono-czarne drzewo.
- LinkedHashMap oferuje 0 (1) wyszukiwanie i wstawianie. Klucze są zamawiane według zamówienia wstawionego. On zaimplementowane przez podwójnie połączone wiadra.
Wyobraź sobie, że przekazałeś pustą mapę drzewa, HashMap i LinkedHashMap do następującej funkcji:
void insertAndPrint(AbstractMap<Integer, String> map) {
int[] array= {1, -1, 0};
for (int x : array) {
map.put(x, Integer.toString(x));
}
for (int k: map.keySet()) {
System.out.print(k + ", ");
}
}
Wyniki dla każdego z nich będą wyglądały jak wyniki poniżej.
Dla HashMap, wyjście było, w moich własnych testach, {0, 1, -1}, ale to może być dowolne zamówienie. Nie ma gwarancji na
zamawiam.
Treemap, wyjście było,{ -1, 0, 1}
LinkedList, wyjście było,{ 1, -1, 0}
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-02-17 14:16:11
-
HashMap:
- zamówienie nie jest utrzymywane
- szybciej niż LinkedHashMap
- używane do przechowywania sterty obiektów
-
LinkedHashMap:
- Kolejność wstawiania LinkedHashMap będzie zachowana
- wolniejszy niż HashMap i szybszy niż TreeMap
- jeśli chcesz utrzymać zamówienie reklamowe, użyj tego.
-
TreeMap:
- TreeMap jest mapowaniem opartym na drzewie
- TreeMap będzie podążał za naturalnym kolejność klucza
- wolniej niż HashMap i LinkedHashMap
- Użyj mapy drzewa, gdy musisz zachować naturalną (domyślną) kolejność
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
2018-09-30 01:09:06
HashMap
może zawierać jeden klucz null.
HashMap nie utrzymuje porządku.
TreeMap
Mapa drzewa nie może zawierać żadnego klucza null.
TreeMap utrzymuje kolejność rosnącą.
LinkedHashMap
LinkedHashMap może być używany do utrzymywania porządku wstawiania, w którym klucze są wstawiane do mapy lub może być również używany do utrzymywania porządku dostępu, w którym klucze są dostępne.
Przykłady::
1) Mapa HashMap = new HashMap ();
map.put(null, "Kamran");
map.put(2, "Ali");
map.put(5, "From");
map.put(4, "Dir");`enter code here`
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
2) Mapa TreeMap = new TreeMap ();
map.put(1, "Kamran");
map.put(2, "Ali");
map.put(5, "From");
map.put(4, "Dir");
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
3) linkedhashmap map = new LinkedHashMap ();
map.put(1, "Kamran");
map.put(2, "Ali");
map.put(5, "From");
map.put(4, "Dir");
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
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-20 10:44:55