Jaka jest różnica między HashMap
, LinkedHashMap
a TreeMap
w Javie? Nie widzę żadnej różnicy w wynikach, ponieważ wszystkie trzy mają keySet
i values
. Co to Hashtable
jest
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());
Hashtable
iHashMap
jest to, że w Hashtable „ani klucz, ani wartość nie mogą być zerowe”. To ograniczenie nie istnieje na tym drugim.Wolę prezentację wizualną:
źródło
Wszystkie trzy reprezentują mapowanie od unikatowych kluczy do wartości, a zatem implementują interfejs Map .
HashMap to mapa oparta na haszowaniu klawiszy. Obsługuje operacje O / 1 get / put. Klucze muszą mieć spójne implementacje
hashCode()
iequals()
aby to działało.LinkedHashMap jest bardzo podobny do HashMap, ale zwiększa świadomość 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 to mapowanie oparte na drzewie. Operacje put / get zajmują czas O (log n). Wymaga, aby przedmioty miały jakiś mechanizm porównywania, albo z Porównywalnym, albo z Komparatorem. Kolejność iteracji jest określana przez ten mechanizm.
źródło
LinkedHashMap
będzie iterował w kolejności wstawiania, a nie w kolejności naturalnej. Więc jeśli dodasz(2,5,3)
do aLinkedHashMap
i zrób dla każdego nad nim, to zwróci2,5,3
. Gdyby to było2,5,3
DoTreeMap
powróci2,3,5
.Zobacz, gdzie każda klasa znajduje się w hierarchii klas na poniższym diagramie ( większy ). TreeMap implementuje,
SortedMap
aNavigableMap
whileHashMap
nie.HashTable
jest przestarzały iConcurrentHashMap
należy użyć odpowiedniej klasy.źródło
HashMap
HashTable
LinkedHashMap
TreeMap
źródło
Jeszcze trochę informacji z własnego doświadczenia z mapami, kiedy będę z nich korzystać:
removeEldestEntry()
metody. Umożliwia to utworzenie obiektu pamięci podręcznej, który może wygasać dane przy użyciu określonych przez Ciebie kryteriów.źródło
Wszystkie trzy klasy
HashMap
,TreeMap
iLinkedHashMap
implementujejava.util.Map
interfejs i reprezentuje mapowanie z unikalnym kluczem do wartości.HashMap
A
HashMap
zawiera wartości oparte na kluczu.Zawiera tylko unikalne elementy.
Może mieć jeden klucz zerowy i wiele wartości zerowych.
Nie utrzymuje porządku .
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
LinkedHashMap
LinkedHashMap
zawiera wartości oparte na kluczu.Jest to to samo, co HashMap zamiast tego utrzymuje porządek wstawiania . // Zobacz spowolnienie klasy poniżej
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
TreeMap
TreeMap
zawiera wartości oparte na kluczu. Implementuje interfejs NavigableMap i rozszerza klasę AbstractMap.Jest to to samo, co
HashMap
zamiast tego utrzymuje porządek rosnący (posortowany według naturalnej kolejności klucza).public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
Hashtable
Jest to klasyczna klasa.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
Ref: http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html
źródło
Zobacz, jak zmienia się wydajność.
Mapa drzewa będąca implementacją mapy posortowanej. Złożoność operacji put, get i zawiera klucz to O (log n) ze względu na naturalne uporządkowanie
źródło
@Amit:
SortedMap
to interfejs, podczasTreeMap
gdy klasa, która implementujeSortedMap
interfejs. Oznacza to, że jeśli postępuje zgodnie z protokołem, o którySortedMap
prosi jego implementator. Drzewo, o ile nie zostanie zaimplementowane jako drzewo wyszukiwania, nie może dać uporządkowanych danych, ponieważ drzewo może być dowolnym rodzajem drzewa. Aby więc TreeMap działał jak Sorted Order, implementuje SortedMap (np. Binary Search Tree - BST, zrównoważony BST jak AVL i RB Tree, a nawet Ternary Search Tree - najczęściej używane do wyszukiwania iteracyjnego w uporządkowany sposób).W NUT-SHELL
HashMap
: podaje dane w O (1), bez zamawianiaTreeMap
: podaje dane w O (log N), baza 2. z uporządkowanymi kluczamiLinkedHashMap
: jest funkcją tabeli mieszania z połączoną listą (pomyśl o indeksowanej liście SkipList) do przechowywania danych w sposób, w jaki są wstawiane do drzewa. Najlepiej nadaje się do implementacji LRU (ostatnio używane).źródło
Poniżej wymieniono główne różnice między HashMap i TreeMap
HashMap nie utrzymuje żadnego zamówienia. Innymi słowy, HashMap nie daje żadnej gwarancji, że element wstawiony jako pierwszy zostanie wydrukowany jako pierwszy, podobnie jak TreeSet, elementy TreeMap są również sortowane zgodnie z naturalną kolejnością elementów
Wewnętrzna implementacja HashMap korzysta z funkcji Hashing, a TreeMap wewnętrznie korzysta z implementacji drzewa czerwono-czarnego.
HashMap może przechowywać jeden klucz zerowy i wiele wartości zerowych. Drzewo nie może zawierać kluczy zerowych, ale może zawierać wiele wartości zerowych.
HashMap ma stałą wydajność czasową dla podstawowych operacji, takich jak get i put, tj. O (1). Zgodnie z dokumentacją Oracle, TreeMap zapewnia gwarantowany koszt dziennika (n) dla metody get and put.
HashMap jest znacznie szybszy niż TreeMap, ponieważ czas działania HashMap jest stały w stosunku do czasu dziennika TreeMap dla większości operacji.
HashMap używa do porównania metody equals (), a TreeMap do porównywania używa metody CompareTo ().
HashMap implementuje interfejs Map, a TreeMap implementuje interfejs NavigableMap.
źródło
Są to różne implementacje tego samego interfejsu. Każda implementacja ma pewne zalety i wady (szybkie wstawianie, wolne wyszukiwanie) i odwrotnie.
Szczegółowe informacje znajdują się w javadoc TreeMap , HashMap , LinkedHashMap .
źródło
Mapa mieszania nie zachowuje kolejności wstawiania.
Przykład. Hashmap Jeśli wstawiasz klucze jak
Może przechowywać jako
Połączony Hashmap zachowuje kolejność wstawiania.
Przykład.
Jeśli wkładasz klucze
Będzie przechowywać jako
tak samo jak wstawiamy.
Mapa drzewa przechowuje wartości w porządku rosnącym kluczy. Przykład.
Jeśli wkładasz klucze
Będzie przechowywać jako
źródło
HashMap:
LinkedHashMap:
TreeMap:
źródło
Wszystkie oferują mapę klucz-> wartość oraz sposób na iterację po klawiszach. Najważniejsze rozróżnienie między tymi klasami to gwarancje czasowe i kolejność kluczy.
Wyobraź sobie, że przekazałeś pustą TreeMap, HashMap i LinkedHashMap do następującej funkcji:
Dane wyjściowe dla każdego będą wyglądać jak poniżej.
W przypadku HashMap dane wyjściowe były według moich testów {0, 1, -1}, ale może to być dowolna kolejność. Nie ma gwarancji na zamówienie.
Treemap, dane wyjściowe to {-1, 0, 1}
LinkedList, dane wyjściowe to {1, -1, 0}
źródło
Chociaż jest tu wiele doskonałych odpowiedzi, chciałbym przedstawić własną tabelę opisującą różne
Map
implementacje dołączone do Java 11.Widzimy te różnice wymienione na grafice tabeli:
HashMap
jest uniwersalnym zastosowaniemMap
powszechnie stosowanym, gdy nie masz specjalnych potrzeb.LinkedHashMap
rozszerzaHashMap
, dodając to zachowanie: Utrzymuje porządek, w kolejności, w jakiej wpisy zostały pierwotnie dodane . Zmiana wartości przy wprowadzaniu wartości klucza nie zmienia jej miejsca w kolejności.TreeMap
również utrzymuje porządek, ale używa albo (a) „naturalnego” porządku , co oznacza wartośćcompareTo
metody na kluczowych obiektach zdefiniowanych wComparable
interfejsie, lub (b) wywołuje podaną przezComparator
Ciebie implementację .TreeMap
implementuje zarównoSortedMap
interfejs, jak i jego następcę,NavigableMap
interfejs.TreeMap
nie nie pozwalają NULL jako klucz , aHashMap
&LinkedHashMap
zrobić.HashTable
jest dziedzictwem , od Java 1 . Dostarczone przezConcurrentHashMap
klasę. Cytując Javadoc:ConcurrentHashMap
przestrzega tej samej specyfikacji funkcjonalnej coHashtable
i zawiera wersje metod odpowiadające każdej z metodHashtable
.źródło
HashMap
może zawierać jeden klucz zerowy.
HashMap nie utrzymuje kolejności.
TreeMap
TreeMap nie może zawierać żadnego klucza zerowego.
TreeMap utrzymuje porządek rosnący.
LinkedHashMap
LinkedHashMap może być używany do utrzymywania kolejności wstawiania, na której klucze są wstawiane do mapy lub może być również używany do utrzymania kolejności dostępu, na której dostępne są klucze.
Przykłady ::
1) Mapa HashMap = nowa HashMap ();
2) Mapa TreeMap = nowa TreeMap ();
3) Mapa LinkedHashMap = nowy LinkedHashMap ();
źródło
Najważniejszym spośród wszystkich trzech jest sposób, w jaki zapisują kolejność wpisów.
HashMap
- Nie zapisuje kolejności wpisów. na przykład.LinkedHashMap
: Zapisuje kolejność, w jakiej dokonano wpisów. na przykład:TreeMap
: Zapisuje wpisy w kolejności rosnącej klawiszy. na przykład:źródło