Jakie są różnice między HashMap
a a Hashtable
w Javie?
Który z nich jest bardziej wydajny w zastosowaniach bez wątków?
java
collections
hashmap
hashtable
dmanxiii
źródło
źródło
ConcurrentMap
tutaj nie jest konieczne, ponieważ w pytaniu jest napisane: „aplikacje bez wątków”, co oznacza, że wątkowanie / współbieżność nie stanowi problemu.Odpowiedzi:
Istnieje kilka różnic między
HashMap
iHashtable
w Javie:Hashtable
jest zsynchronizowany , aleHashMap
nie jest. To sprawia, żeHashMap
lepiej jest dla aplikacji bez wątków, ponieważ Obiekty niezsynchronizowane zwykle działają lepiej niż te zsynchronizowane.Hashtable
nie zezwala nanull
klucze ani wartości.HashMap
pozwala na jedennull
klucz i dowolną liczbęnull
wartości.Jedną z podklas HashMap jest
LinkedHashMap
, więc jeśli chcesz mieć przewidywalną kolejność iteracji (która domyślnie jest kolejnością wstawiania), możesz łatwo zamienićHashMap
naLinkedHashMap
. Nie byłoby to takie proste, gdybyś używałHashtable
.Ponieważ synchronizacja nie stanowi dla ciebie problemu, polecam
HashMap
. Jeśli synchronizacja staje się problemem, możesz również spojrzeć naConcurrentHashMap
.źródło
Collections.synchronizedMap()
.Hashtable
(„synchronizowanie każdej metody powinno zadbać o wszelkie problemy z współbieżnością!”) Znacznie pogarsza to w przypadku aplikacji wątkowych. Lepiej zsynchronizuj zewnętrznieHashMap
(i myśląc o konsekwencjach) lub skorzystaj zConcurrentMap
implementacji (i wykorzystaj jej rozszerzony interfejs API do współbieżności). Podsumowując: jedynym powodem do użyciaHashtable
jest to, że wymaga tego starszy interfejs API (od ok. 1996 r.).Zauważ, że wiele odpowiedzi mówi, że Hashtable jest zsynchronizowany. W praktyce to niewiele kosztuje. Synchronizacja jest na metodach akcesor / mutator, aby zatrzymać jednoczesne dodawanie lub usuwanie wątków z mapy, ale w prawdziwym świecie często będziesz potrzebować dodatkowej synchronizacji.
Bardzo popularnym idiomem jest „sprawdź, a następnie umieść” - tj. Poszukaj wpisu w
Map
i dodaj go, jeśli jeszcze nie istnieje. Nie jest to w żaden sposób operacja atomowa, niezależnie od tego, czy używasz,Hashtable
czyHashMap
.Równoważnie zsynchronizowane
HashMap
można uzyskać poprzez:Ale aby poprawnie zaimplementować tę logikę, potrzebujesz dodatkowej synchronizacji formularza:
Nawet iteracja
Hashtable
wpisów (lubHashMap
uzyskanych przezCollections.synchronizedMap
) nie jest bezpieczna dla wątków, chyba że zabezpieczysz je równieżMap
przed modyfikacją poprzez dodatkową synchronizację.Implementacje
ConcurrentMap
interfejsu (na przykładConcurrentHashMap
) rozwiązują niektóre z tych problemów, włączając w to semantykę bezpiecznego sprawdzania, a następnie działania wątków, takich jak:źródło
Hashtable
jest uważany za starszy kod. Nic nieHashtable
można tego zrobić za pomocąHashMap
ani pochodnychHashMap
, więc dla nowego kodu nie widzę żadnego uzasadnienia dla powrotu doHashtable
.źródło
To pytanie jest często zadawane w trakcie wywiadu, aby sprawdzić, czy kandydat rozumie prawidłowe wykorzystanie klas zbiórki i jest świadomy dostępnych alternatywnych rozwiązań.
HashMap
Klasa jest z grubsza odpowiednikiemHashtable
, poza tym, że nie jest zsynchronizowany i zezwala na wartości null. (HashMap
zezwala na wartości null jako klucz i wartość,Hashtable
ale nie zezwala nanull
s).HashMap
nie gwarantuje, że kolejność mapy pozostanie stała w czasie.HashMap
nie jest zsynchronizowany, natomiastHashtable
jest zsynchronizowany.HashMap
jest odporny na awarie, podczas gdy moduł wyliczający dlaHashtable
nie jest, i rzuca,ConcurrentModificationException
jeśli jakikolwiek inny Wątek modyfikuje strukturalnie mapę poprzez dodanie lub usunięcie dowolnego elementu opróczIterator
własnejremove()
metody. Nie jest to jednak zachowanie gwarantowane i JVM dołoży wszelkich starań.Uwaga na niektóre ważne warunki:
Hashtable
będzie musiał uzyskać blokadę obiektu, podczas gdy inni będą czekać na zwolnienie blokady.set
metodę, ponieważ nie modyfikuje ona kolekcji „strukturalnie”. Jeśli jednak przed wywołaniemset
kolekcja zostanie zmodyfikowana strukturalnie,IllegalArgumentException
zostanie wyrzucona.HashMap
mogą być synchronizowane przezMap m = Collections.synchronizeMap(hashMap);
Mapa zapewnia widoki kolekcji zamiast bezpośredniej obsługi iteracji za pomocą obiektów wyliczenia. Widoki kolekcji znacznie zwiększają ekspresję interfejsu, co omówiono w dalszej części tego rozdziału. Mapa pozwala na iterację kluczy, wartości lub par klucz-wartość;
Hashtable
nie zapewnia trzeciej opcji. Mapa zapewnia bezpieczny sposób usuwania wpisów w trakcie iteracji;Hashtable
nie. Wreszcie, mapa naprawia niewielki brakHashtable
interfejsu.Hashtable
ma metodę o nazwie zawiera, która zwraca wartość true, jeśliHashtable
zawiera określoną wartość. Biorąc pod uwagę jego nazwę, można oczekiwać, że ta metoda zwróci true, jeśliHashtable
zawiera dany klucz, ponieważ klucz jest podstawowym mechanizmem dostępu dlaHashtable
. Interfejs mapy eliminuje to źródło nieporozumień, zmieniając nazwę metodycontainsValue
. Poprawia to również spójność interfejsu -containsValue
równoleglecontainsKey
.źródło
set
operacji naHashMap
. 3)put(...)
Operacja nie zostanie rzucona,IllegalArgumentException
jeśli nastąpiła poprzednia zmiana. 4) Zachowanie szybkie w przypadku awarii występujeHashMap
również po zmianie mapowania. 5) Gwarantowane jest szybkie działanie . (Nie można zagwarantować zachowaniaHashTable
równoczesnej modyfikacji. Rzeczywiste zachowanie jest ... nieprzewidywalne.)Hashtable
nie gwarantuje też, że kolejność elementów mapy będzie stabilna w czasie. (Być może myliszHashtable
sięLinkedHashMap
.)thing.set(thing.get() + 1);
, które częściej niż nie łapie debiutantom przez zaskoczenie jako całkowicie bezbronny, zwłaszcza jeśliget()
iset()
są zsynchronizowane metod. Wielu z nich oczekuje magii.HashMap
: ImplementacjaMap
interfejsu używającego kodów skrótu do indeksowania tablicy.Hashtable
: Cześć, 1998 dzwonił. Chcą z powrotem interfejsu API swoich kolekcji.Poważnie, jednak lepiej trzymać się z daleka
Hashtable
. W przypadku aplikacji jednowątkowych nie potrzebujesz dodatkowych kosztów synchronizacji. W przypadku wysoce współbieżnych aplikacji synchronizacja paranoiczna może prowadzić do głodu, impasu lub niepotrzebnych przerw w usuwaniu elementów bezużytecznych. Jak wskazał Tim Howland, możesz użyćConcurrentHashMap
zamiast tego.źródło
Należy pamiętać, że
HashTable
była to starsza klasa przed wprowadzeniem Java Collections Framework (JCF), a później została zmodernizowana w celu implementacjiMap
interfejsu. Tak byłoVector
iStack
.Dlatego zawsze trzymaj się z dala od nich w nowym kodzie, ponieważ zawsze istnieje lepsza alternatywa w JCF, jak zauważyli inni.
Oto ściągawka z kolekcji Java , która okaże się przydatna. Zauważ, że szary blok zawiera starszą klasę HashTable, Vector i Stack.
źródło
Istnieje już wiele dobrych odpowiedzi. Dodam kilka nowych punktów i podsumowuję to.
HashMap
iHashtable
oba służą do przechowywania danych w formie klucza i wartości . Oba używają techniki mieszania do przechowywania unikalnych kluczy. Istnieje jednak wiele różnic między klasami HashMap i Hashtable, które podano poniżej.HashMap
HashMap
nie jest zsynchronizowany. Nie jest bezpieczny dla wątków i nie może być współużytkowany przez wiele wątków bez odpowiedniego kodu synchronizacji.HashMap
dopuszcza jeden klucz zerowy i wiele wartości zerowych.HashMap
to nowa klasa wprowadzona w JDK 1.2.HashMap
jest szybki.HashMap
synchronizacji poprzez wywołanie tego koduMap m = Collections.synchronizedMap(HashMap);
HashMap
jest trawersowany przez Iterator.HashMap
jest szybki.HashMap
dziedziczy klasę AbstractMap.Hashtable
Hashtable
jest zsynchronizowany. Jest bezpieczny dla wątków i może być współdzielony z wieloma wątkami.Hashtable
nie zezwala na żaden klucz lub wartość zerową.Hashtable
jest klasą starszą.Hashtable
jest wolny.Hashtable
jest wewnętrznie zsynchronizowany i nie można go zsynchronizować.Hashtable
jest trawersowany przez Enumerator i Iterator.Hashtable
nie działa szybko.Hashtable
dziedziczy klasę Dictionary.Dalsza lektura Jaka jest różnica między HashMap i Hashtable w Javie?
źródło
Oprócz tego, co powiedział izb,
HashMap
dopuszcza wartości zerowe, podczas gdyHashtable
nie.Zauważ też, że
Hashtable
rozszerzaDictionary
klasę, która jako stan Javadocs jest przestarzała i została zastąpiona przezMap
interfejs.źródło
Spójrz na tę tabelę. Zapewnia porównania różnych struktur danych wraz z
HashMap
iHashtable
. Porównanie jest precyzyjne, jasne i łatwe do zrozumienia.Java Collection Matrix
źródło
Hashtable
jest podobny doHashMap
i ma podobny interfejs. Zaleca się korzystanie z niegoHashMap
, chyba że potrzebujesz obsługi starszych aplikacji lub synchronizacji, ponieważHashtables
metody są zsynchronizowane. Więc w twoim przypadku, ponieważ nie jesteś wielowątkowy,HashMaps
jesteś najlepszym wyborem.źródło
Inną kluczową różnicą między hashtable i hashap jest to, że Iterator w HashMap jest szybki w razie awarii, podczas gdy moduł wyliczający dla Hashtable nie jest, i zgłasza ConcurrentModificationException, jeśli jakikolwiek inny wątek modyfikuje mapę strukturalnie przez dodanie lub usunięcie dowolnego elementu oprócz własnej metody remove (). Nie jest to jednak zachowanie gwarantowane i JVM dołoży wszelkich starań. ”
Moje źródło: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
źródło
Oprócz wszystkich innych ważnych już wspomnianych tutaj aspektów, API API (np. Interfejs mapy) jest cały czas modyfikowane, aby było zgodne z „najnowszymi i największymi” dodatkami do specyfikacji Java.
Na przykład porównaj iterację mapy Java 5:
kontra stare podejście Hashtable:
W Javie 1.8 obiecujemy również, że będziemy mogli budować i uzyskiwać dostęp do HashMaps, jak w starych dobrych językach skryptowych:
Aktualizacja: Nie, nie wylądują w 1.8 ... :(
Czy ulepszenia kolekcji Project Coin będą dostępne w JDK8?
źródło
Hashtable
jest zsynchronizowany, aleHashMap
nie jest. To sprawia, żeHashtable
wolniej niżHashmap
.W przypadku aplikacji bez wątków używaj,
HashMap
ponieważ pod względem funkcjonalności są one takie same.źródło
HashTable jest zsynchronizowany, jeśli używasz go w jednym wątku, możesz użyć HashMap , który jest wersją niezsynchronizowaną. Niezsynchronizowane obiekty są często nieco bardziej wydajne. Nawiasem mówiąc, jeśli wiele wątków jednocześnie uzyskuje dostęp do HashMap i co najmniej jeden z wątków modyfikuje mapę strukturalnie, musi być zsynchronizowany zewnętrznie. Możesz owinąć niezsynchronizowaną mapę w zsynchronizowaną, używając:
HashTable może zawierać tylko niepuste obiekty jako klucz lub wartość. HashMap może zawierać jeden klucz zerowy i wartości zerowe.
Iteratory zwrócone przez Mapę działają szybko w razie awarii, jeśli mapa zostanie zmodyfikowana strukturalnie w dowolnym momencie po utworzeniu iteratora, w jakikolwiek sposób, z wyjątkiem własnej metody usuwania iteratora, iterator wyrzuci
ConcurrentModificationException
. Zatem w obliczu jednoczesnej modyfikacji iterator zawodzi szybko i czysto, zamiast ryzykować arbitralne, niedeterministyczne zachowanie w nieokreślonym czasie w przyszłości. Natomiast wyliczenia zwracane przez metody kluczy i elementów Hashtable nie są szybkie.HashTable i HashMap są członkami Java Collections Framework (od platformy Java 2 v1.2, HashTable został zmodernizowany w celu implementacji interfejsu Map).
HashTable jest uważany za starszy kod, dokumentacja zaleca użycie ConcurrentHashMap zamiast Hashtable, jeśli pożądana jest bezpieczna dla wątków wysoce współbieżna implementacja.
HashMap nie gwarantuje kolejności zwracania elementów. W przypadku HashTable wydaje mi się, że jest tak samo, ale nie jestem do końca pewien, nie znajduję zasobu, który jasno to stwierdza.
źródło
HashMap
iHashtable
mają również znaczne różnice algorytmiczne. Nikt wcześniej o tym nie wspominał, dlatego o tym wspominam.HashMap
zbuduje tablicę skrótów o mocy dwóch rozmiarów, zwiększy ją dynamicznie tak, że masz maksymalnie osiem elementów (kolizji) w dowolnym segmencie i bardzo dobrze wymieszaj elementy dla ogólnych typów elementów. JednakHashtable
implementacja zapewnia lepszą i dokładniejszą kontrolę nad skrótem, jeśli wiesz, co robisz, a mianowicie możesz naprawić rozmiar tabeli, używając np. Najbliższej liczby pierwszej do rozmiaru domeny wartości, a to zapewni lepszą wydajność niż HashMap, tj. Mniej kolizji w niektórych przypadkach.Niezależnie od oczywistych różnic omawianych obszernie w tym pytaniu, widzę Hashtable jako samochód „z napędem ręcznym”, w którym masz lepszą kontrolę nad haszowaniem, a HashMap jako odpowiednik „automatycznego napędu”, który ogólnie dobrze się spisuje.
źródło
W oparciu o informacje tutaj polecam korzystanie z HashMap. Myślę, że największą zaletą jest to, że Java uniemożliwi modyfikowanie go podczas iteracji, chyba że zrobisz to przez iterator.
źródło
A
Collection
- czasami nazywany kontenerem - to po prostu obiekt, który grupuje wiele elementów w jedną jednostkę.Collection
S są używane do przechowywania, pobierania, manipulowania i komunikowania danych agregowanych. Struktura kolekcji W to ujednolicona architektura do reprezentowania kolekcji i manipulowania nimi.HashMap
JDK1.2
I HashTableJDK1.0
zarówno stosuje się do oznaczania grup przedmiotów, które są reprezentowane w<Key, Value>
pary. Każda<Key, Value>
para nazywa sięEntry
obiektem. Zbiór wpisów jest określany przez obiektHashMap
iHashtable
. Klucze w kolekcji muszą być unikalne lub charakterystyczne. [ponieważ są używane do pobierania zamapowanej wartości określonego klucza. wartości w kolekcji można powielić.]« Członek Superclass, Legacy and Collection Framework
Hashtable to wprowadzona w starszej klasie klasa
JDK1.0
, która jest podklasą klasy Dictionary. FromJDK1.2
Hashtable został przeprojektowany do implementacji interfejsu Map, aby stać się członkiem frameworka kolekcji. HashMap jest członkiem Java Collection Framework od samego początku jego wprowadzeniaJDK1.2
. HashMap jest podklasą klasy AbstractMap.« Początkowa wydajność i współczynnik obciążenia
Pojemność to liczba segmentów w tabeli skrótów, a początkowa pojemność to po prostu pojemność w momencie tworzenia tabeli skrótów. Zauważ, że tabela skrótów jest otwarta: w przypadku „
hash
collision
” pojedyncze wiadro przechowuje wiele wpisów, które należy kolejno przeszukiwać. Współczynnik obciążenia jest miarą tego, jak pełne jest wypełnienie tabeli mieszającej, zanim jej pojemność zostanie automatycznie zwiększona.HashMap tworzy pustą tablicę skrótów z domyślną początkową pojemnością (16) i domyślnym współczynnikiem obciążenia (0,75). Gdzie as Hashtable konstruuje pusty hashtable z domyślną pojemnością początkową (11) i współczynnikiem obciążenia / wypełnienia (0,75).
« Modyfikacja strukturalna w przypadku zderzenia mieszającego
HashMap
,Hashtable
w przypadku kolizji skrótu przechowują wpisy map na połączonych listach. Z Java8,HashMap
jeśli wiadro skrótu przekroczy określony próg, to wiadro się zmienilinked list of entries to a balanced tree
. które poprawiają wydajność najgorszego przypadku od O (n) do O (log n). Podczas konwertowania listy na drzewo binarne kod skrótu jest używany jako zmienna rozgałęziająca. Jeśli w tym samym wiadrze znajdują się dwa różne kody skrótu, jeden jest uważany za większy i idzie na prawo od drzewa, a drugi na lewo. Ale gdy oba kodyHashMap
skrótu są równe, zakłada, że klucze są porównywalne, i porównuje klucz w celu ustalenia kierunku, aby zachować pewną kolejność. Dobrą praktyką jestHashMap
porównywanie kluczy . Po dodaniu wpisów, jeśli osiągnie rozmiar wiadraTREEIFY_THRESHOLD = 8
przekonwertuj połączoną listę wpisów na zrównoważone drzewo, po usunięciu wpisów mniej niżTREEIFY_THRESHOLD
i co najwyżejUNTREEIFY_THRESHOLD = 6
przekształci zrównoważone drzewo w połączoną listę wpisów. Java 8 SRC , stosu« Iteracja widoku kolekcji, Fast-Fast i Fail-Safe
Iterator
jest z natury szybki w działaniu. tzn. zgłasza ConcurrentModificationException, jeśli kolekcja jest modyfikowana podczas iteracji innej niż jej własna metoda remove (). GdzieEnumeration
z natury jest bezpieczny w razie awarii. Nie rzuca żadnych wyjątków, jeśli kolekcja jest modyfikowana podczas iteracji.Zgodnie z dokumentacją Java API Docs, Iterator jest zawsze preferowany niż wyliczanie.
UWAGA: Funkcjonalność interfejsu wyliczania jest zduplikowana przez interfejs Iteratora. Ponadto Iterator dodaje opcjonalną operację usuwania i ma krótsze nazwy metod. Nowe implementacje powinny rozważyć użycie Iteratora zamiast opcji Wyliczanie.
W Javie 5 wprowadzono interfejs ConcurrentMap :
ConcurrentHashMap
- wysoce współbieżna, wysokowydajnaConcurrentMap
implementacja wspierana przez tablicę skrótów. Ta implementacja nigdy nie blokuje się podczas pobierania danych i pozwala klientowi wybrać poziom współbieżności dla aktualizacji. Ma on zastąpić drop-in dlaHashtable
: oprócz implementacjiConcurrentMap
, obsługuje wszystkie specyficzne dla niego „starsze” metodyHashtable
.Każda
HashMapEntry
wartość jest lotna, zapewniając w ten sposób drobną spójność ziarna dla spornych modyfikacji i kolejnych odczytów; każdy odczyt odzwierciedla najnowszą ukończoną aktualizacjęIteratory i wyliczenia są bezpieczne w razie awarii - odzwierciedlając stan w pewnym momencie od utworzenia iteratora / wyliczenia; pozwala to na jednoczesne odczyty i modyfikacje kosztem zmniejszonej spójności. Nie zgłaszają wyjątku ConcurrentModificationException. Jednak iteratory są zaprojektowane do użycia tylko przez jeden wątek na raz.
Podobnie,
Hashtable
ale w przeciwieństwie doHashMap
tej klasy, nie pozwala na użycie wartości null jako klucza lub wartości.« Klucze zerowe i wartości zerowe
HashMap
dopuszcza maksymalnie jeden klucz zerowy i dowolną liczbę wartości zerowych. Gdzie asHashtable
nie zezwala nawet na pojedynczy klucz zerowy i zerową wartość, jeśli klucz lub wartość zerowa jest, wówczas zgłasza wyjątek NullPointerException. Przykład« Zsynchronizowany, bezpieczny dla wątków
Hashtable
jest wewnętrznie zsynchronizowany. Dlatego bardzo bezpieczne jest stosowanieHashtable
w aplikacjach wielowątkowych. GdzieHashMap
nie jest wewnętrznie zsynchronizowany. Dlatego stosowanieHashMap
w aplikacjach wielowątkowych bez zewnętrznej synchronizacji nie jest bezpieczne . Możesz zewnętrznie synchronizowaćHashMap
za pomocąCollections.synchronizedMap()
metody.« Wydajność
Ponieważ
Hashtable
jest zsynchronizowany wewnętrznie, powoduje to, że jestHashtable
nieco wolniejszy niżHashMap
.@Widzieć
HashMap
w Javie 8źródło
W przypadku aplikacji wielowątkowych często można uniknąć ConcurrentHashMap - w zależności od wymagań dotyczących wydajności.
źródło
1.
Hashmap
orazHashTable
zarówno klucz, jak i wartość.2.
Hashmap
może przechowywać jeden klucz jakonull
.Hashtable
nie można przechowywaćnull
.3.
HashMap
nie jest zsynchronizowany, aleHashtable
jest zsynchronizowany.4.
HashMap
może być synchronizowany zCollection.SyncronizedMap(map)
źródło
Oprócz wspomnianych różnic, należy zauważyć, że od Java 8
HashMap
dynamicznie zastępuje Węzły (lista połączona) używane w każdym segmencie przez TreeNodes (czerwono-czarne drzewo), więc nawet jeśli występują kolizje o wysokim haszu, najgorszy przypadek, gdy wyszukiwanie jestO (log (n)) dla
HashMap
Vs O (n) wHashtable
.* Powyższa poprawa nie została zastosowana
Hashtable
jeszcze, ale tylkoHashMap
,LinkedHashMap
iConcurrentHashMap
.FYI, obecnie
TREEIFY_THRESHOLD = 8
: jeśli segment zawiera więcej niż 8 węzłów, połączona lista jest przekształcana w zrównoważone drzewo.UNTREEIFY_THRESHOLD = 6
: gdy wiadro staje się zbyt małe (z powodu usunięcia lub zmiany rozmiaru), drzewo jest konwertowane z powrotem na listę połączoną.źródło
Istnieje 5 podstawowych różnic w HashTable i HashMaps.
źródło
Mój mały wkład:
źródło
HashMap: jest to klasa dostępna w pakiecie java.util i służy do przechowywania elementu w formacie klucza i wartości.
Hashtable: Jest to klasyczna klasa, która jest rozpoznawana w ramach kolekcji.
źródło
HashTable to starsza klasa w jdk, której nie należy już używać. Zamień jego użycie na ConcurrentHashMap . Jeśli nie potrzebujesz bezpieczeństwa wątków, użyj HashMap, który nie jest wątkowo bezpieczny, ale szybszy i zużywa mniej pamięci.
źródło
Hashtable
jest zsynchronizowany, podczas gdyHashMap
nie jest.HashMap
jest bezpieczny w razie awarii, podczas gdy moduł wyliczający dlaHashtable
nie. Jeśli zmienisz mapę podczas iteracji, będziesz wiedział.HashMap
dopuszcza w nim wartości zerowe, podczas gdyHashtable
nie.źródło
HashMap i HashTable
1) Hashtable i Hashmap implementują interfejs java.util.Map 2) Zarówno Hashmap, jak i Hashtable to kolekcja oparta na haszowaniu. i praca nad haszowaniem. więc są to podobieństwa między HashMap i HashTable.
1) Pierwszą różnicą jest to, że HashMap nie jest bezpieczny dla wątków, podczas gdy HashTable jest ThreadSafe
2) HashMap jest lepszy pod względem wydajności, ponieważ nie jest bezpieczny dla wątków. natomiast wydajność Hashtable nie jest lepsza, ponieważ jest bezpieczna dla wątków. więc wiele wątków nie może jednocześnie uzyskać dostępu do Hashtable.
źródło
Hashtable:
Hashtable to struktura danych, która zachowuje wartości pary klucz-wartość. Nie dopuszcza wartości null zarówno dla kluczy, jak i wartości. Otrzymasz,
NullPointerException
jeśli dodasz wartość zerową. Jest zsynchronizowany. Więc pochodzi z jego kosztów. Tylko jeden wątek może uzyskać dostęp do HashTable w określonym czasie.Przykład :
HashMap:
HashMap jest jak Hashtable, ale akceptuje także parę wartości klucza. Pozwala zerować zarówno klucze, jak i wartości. Jego wydajność jest lepsza niż
HashTable
, ponieważ jestunsynchronized
.Przykład:
źródło
HashMap
jest emulowany, a zatem można go używać,GWT client code
aHashtable
nie jest.źródło
Stary i klasyczny temat, po prostu chcę dodać ten pomocny blog, który wyjaśnia to:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
Blog Manisha Chhabry
źródło
Zarówno HashMap, jak i Hashtable służą do przechowywania danych w formie klucza i wartości. Oba używają techniki mieszania do przechowywania unikalnych kluczy. Istnieje wiele różnic między klasami HashMap i Hashtable, które podano poniżej.
źródło