Jakie są różnice między Hashmapą a Hashtable w Javie?
Jakie są różnice między a HashMap
i a Hashtable
w Javie?
Który jest bardziej wydajny w zastosowaniach bez gwintowania?
30 answers
Istnieje kilka różnic między HashMap
oraz Hashtable
w języku Java:
Hashtable
jest zsynchronizowane , podczas gdyHashMap
nie jest. To sprawia, żeHashMap
jest lepszy dla aplikacji bez wątków, ponieważ niezsynchronizowane obiekty zwykle działają lepiej niż zsynchronizowane.Hashtable
nie zezwalanull
na klucze ani wartości.HashMap
pozwala na jeden klucznull
i dowolną liczbę wartościnull
.Jedną z podklas HashMap jest
LinkedHashMap
, więc w przypadku, gdy chcesz przewidywalną kolejność iteracji (która jest domyślnie kolejnością wstawiania), możesz łatwo zamienićHashMap
naLinkedHashMap
. To nie byłoby takie proste, gdybyś używałHashtable
.
Ponieważ synchronizacja nie jest dla Ciebie problemem, polecam HashMap
. Jeśli synchronizacja stanie się problemem, możesz również spojrzeć na 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
2018-09-13 19:38:58
Zauważ, że wiele odpowiedzi stwierdza, że Hashtable jest zsynchronizowany. w praktyce kupuje się bardzo mało. synchronizacja jest na metody accessor / mutator zatrzyma dwa wątki dodawania lub usuwania z mapy jednocześnie, ale w realnym świecie często będzie potrzebna dodatkowa synchronizacja.
Bardzo powszechnym idiomem jest "check then put" - tzn. poszukaj wpisu w Map
i dodaj go, jeśli jeszcze nie istnieje. To nie jest w żaden sposób atomowy działanie niezależnie od tego, czy używasz Hashtable
czy HashMap
.
Równoważnie zsynchronizowany HashMap
można uzyskać przez:
Collections.synchronizedMap(myMap);
Ale aby poprawnie zaimplementować tę logikę potrzebujesz dodatkowej synchronizacji postaci:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
Nawet iteracja nad wpisami Hashtable
(lub HashMap
uzyskanymi przez Collections.synchronizedMap
) nie jest bezpieczna dla wątku, chyba że ochronisz Map
przed modyfikacją poprzez dodatkową synchronizację.
Implementacje ConcurrentMap
interfejs (dla przykład ConcurrentHashMap
) rozwiąż niektóre z nich, włączając semantykę thread safe check-then-act , taką jak:
ConcurrentMap.putIfAbsent(key, value);
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
2019-03-06 12:32:06
Hashtable
jest uważany za Kod legacy. Nie ma nic o Hashtable
, czego nie można zrobić używając HashMap
lub pochodnych HashMap
, więc dla nowego kodu nie widzę uzasadnienia dla powrotu do 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-08-07 12:18:04
To pytanie jest często zadawane podczas rozmowy kwalifikacyjnej, aby sprawdzić, czy kandydat rozumie prawidłowe wykorzystanie klas kolekcji i jest świadomy dostępnych alternatywnych rozwiązań.
- klasa
HashMap
jest mniej więcej równoważnaHashtable
, z tym wyjątkiem, że nie jest zsynchronizowana i pozwala na null. (HashMap
zezwala na wartości null jako klucz i wartość, podczas gdyHashtable
nie zezwalanull
s). -
HashMap
nie gwarantuje, że kolejność mapy pozostanie stała w czasie. -
HashMap
jest nie zsynchronizowany, podczas gdy {[1] } jest zsynchronizowany. - Iterator w
HashMap
jest bezpieczny, podczas gdy enumerator dlaHashtable
nie jest I throwConcurrentModificationException
jeśli jakikolwiek inny wątek modyfikuje strukturę mapy poprzez dodanie lub usunięcie dowolnego elementu z wyjątkiem własnej metodyIterator
. Ale nie jest to zachowanie gwarantowane i zostanie wykonane przez JVM z najlepszym wysiłkiem.
Uwaga na niektóre ważne terminy:
- Synchronized oznacza, że tylko jeden wątek może modyfikować tabelę hash w jednym punkcie czas. Zasadniczo oznacza to, że każdy wątek przed wykonaniem aktualizacji na
Hashtable
będzie musiał uzyskać blokadę obiektu, podczas gdy inne będą czekać na zwolnienie blokady. - Zabezpieczenie przed awarią jest istotne w kontekście iteratorów. Jeśli iterator został utworzony na obiekcie collection i jakiś inny wątek spróbuje zmodyfikować obiekt collection "strukturalnie", zostanie wyrzucony wyjątek jednoczesnej modyfikacji. Możliwe jest jednak, aby inne wątki wywołały metodę
set
, ponieważ nie modyfikuje kolekcji "strukturalnie". Jeśli jednak przed wywołaniemset
, zbiór został strukturalnie zmodyfikowany,IllegalArgumentException
zostanie wyrzucony. - modyfikacja strukturalna oznacza usunięcie lub wstawienie elementu, który mógłby skutecznie zmienić strukturę mapy.
HashMap
może być zsynchronizowany przez
Map m = Collections.synchronizeMap(hashMap);
Map zapewnia widoki kolekcji zamiast bezpośredniej obsługi iteracji
poprzez obiekty wyliczenia. Widoki kolekcji znacznie zwiększają
wyrazistość interfejsu, jak omówiono w dalszej części tej sekcji.
Map pozwala na iterację nad kluczami, wartościami lub parami klucz-wartość;
Hashtable
nie zapewnia trzeciej opcji. Mapa zapewnia bezpieczną drogę
aby usunąć wpisy w środku iteracji; Hashtable
nie.
Na koniec, Map naprawia drobne niedociągnięcia w interfejsie Hashtable
.
Hashtable
posiada metodę o nazwie contains, która zwraca true jeśli
Hashtable
zawiera podaną wartość. Biorąc pod uwagę jego nazwę, można się tego spodziewać
metoda zwracająca true Jeśli Hashtable
zawiera danego klucza, ponieważ
klucz jest podstawowym mechanizmem dostępu dla Hashtable
. Mapa
interfejs eliminuje to źródło nieporozumień poprzez zmianę nazwy metody
containsValue
. Poprawia to również spójność interfejsu -
containsValue
paralele containsKey
.
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
2019-11-22 17:34:18
HashMap
: implementacja interfejsu Map
, który używa kodów skrótu do indeksowania tablicy.
/ Align = "center" / 1998 Chcą odzyskać swoje zbiory.
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-12-04 21:31:14
Należy pamiętać, że HashTable
była klasą dziedziczoną przed wprowadzeniem Java Collections Framework (JCF), a później została zmodernizowana do implementacji interfejsu Map
. Podobnie było Vector
i Stack
.
Dlatego zawsze trzymaj się od nich z daleka w nowym kodzie, ponieważ zawsze istnieje lepsza alternatywa w JCF , jak zauważyli inni.
Oto Ściągawka Java collection , która okaże się przydatna. Zwróć uwagę, że szary blok zawiera dziedziczoną klasę HashTable, Vector i Stack.
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-06-03 05:43:33
Jest już wiele dobrych odpowiedzi. Dodaję kilka nowych punktów i je podsumowuję.
HashMap
i Hashtable
oba są używane do przechowywania danych w postaci klucza i wartości. Oba używają techniki mieszania do przechowywania unikalnych kluczy.
Ale istnieje wiele różnic między klasami HashMap i Hashtable, które są podane poniżej.
HashMap
-
HashMap
nie jest zsynchronizowana. Nie jest bezpieczny dla wątku i nie może być współdzielony między wieloma wątkami bez odpowiedniego kod synchronizacji. -
HashMap
pozwala na jeden klucz null i wiele wartości null. -
HashMap
to nowa klasa wprowadzona w JDK 1.2. -
HashMap
jest szybki. - możemy zrobić
HashMap
jako zsynchronizowane przez wywołanie tego koduMap m = Collections.synchronizedMap(HashMap);
-
HashMap
jest przemieszczany przez Iterator. - Iterator w {[0] } jest Fail-fast.
-
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 pozwala na użycie żadnego klucza lub wartości null. -
Hashtable
jest klasą dziedziczną. -
Hashtable
jest powolny. -
Hashtable
jest wewnętrznie zsynchronizowana i nie może być niesynchronizowana. -
Hashtable
jest przemieszczana przez Enumerator i Iterator. - wyliczenie w {[1] } nie jest szybkie.
-
Hashtable
dziedziczy klasę słownika.
Czytaj dalej Jaka jest różnica między HashMap a Hashtable w Javie?
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-08-16 12:23:30
Oprócz tego, co powiedział izb, HashMap
dopuszcza wartości null, podczas gdy Hashtable
nie.
Należy również zauważyć, że Hashtable
rozszerza klasę Dictionary
, która jako stan Javadocs jest przestarzała i została zastąpiona przez interfejs Map
.
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
2008-09-02 20:30:00
Spójrz na ten wykres. Dostarcza porównań między różnymi strukturami danych wraz z HashMap
i Hashtable
. Porównanie jest precyzyjne, jasne i łatwe do zrozumienia.
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
2019-11-22 17:34:59
Hashtable
jest podobny do HashMap
i ma podobny interfejs. Zaleca się stosowanie HashMap
, chyba że potrzebujesz wsparcia dla starszych aplikacji lub potrzebujesz synchronizacji, ponieważ metody Hashtables
są zsynchronizowane. Więc w Twoim przypadku, ponieważ nie jesteś wielowątkowy, HashMaps
są najlepszym rozwiązaniem.
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-03-02 08:55:23
Kolejną kluczową różnicą między hashtable i hashmap jest to, że Iterator w Hashmapie jest Fail-fast, podczas gdy enumerator dla Hashtable nie jest i rzuca ConcurrentModificationException, jeśli jakikolwiek inny wątek modyfikuje mapę strukturalnie przez dodanie lub usunięcie dowolnego elementu z wyjątkiem własnej metody remove() iteratora. Ale nie jest to zachowanie gwarantowane i zostanie wykonane przez JVM z najlepszym wysiłkiem."
Moje źródło: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
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
2011-09-08 06:40:13
Poza wszystkimi innymi ważnymi aspektami już tutaj wymienionymi, Collections API (np. map interface) jest cały czas modyfikowane, aby dostosować się do" najnowszych i największych " dodatków do specyfikacji Java.
Na przykład porównaj iterację map Java 5:
for (Elem elem : map.keys()) {
elem.doSth();
}
Przeciw staremu podejściu Hashtable:
for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
Elem elem = (Elem) en.nextElement();
elem.doSth();
}
W Javie 1.8 obiecano nam również możliwość konstruowania i uzyskiwania dostępu do HashMap, jak w starych, dobrych językach skryptowych:
Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];
Update: No, they won ' t ziemia w 1.8... :(
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 12:34:53
Hashtable
jest zsynchronizowany, podczas gdy HashMap
nie jest. to sprawia, że Hashtable
jest wolniejszy niż Hashmap
.
Dla aplikacji z pojedynczym wątkiem, użyj HashMap
, ponieważ są one inne pod względem funkcjonalności.
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
2020-09-15 20:28:43
-
HashTable {[6] } jest zsynchronizowany, jeśli używasz go w jednym wątku, możesz użyć HashMap, która jest wersją niezsynchronizowaną. Niezsynchronizowane obiekty są często nieco bardziej wydajne. Nawiasem mówiąc, jeśli wiele wątków uzyskuje dostęp do Hashmapy jednocześnie, a przynajmniej jeden z wątków modyfikuje mapę strukturalnie, musi być zsynchronizowana zewnętrznie. Możesz zawinąć niezsynchronizowaną mapę w zsynchronizowaną używając :
Map m = Collections.synchronizedMap(new HashMap(...));
HashTable może tylko zawiera obiekt inny niż null jako klucz lub jako wartość. HashMap może zawierać jeden klucz null i wartości null.
Iteratory zwracane przez Map są Fail-fast, jeśli mapa zostanie strukturalnie zmodyfikowana w dowolnym momencie po utworzeniu iteratora, w jakikolwiek sposób z wyjątkiem metody remove iteratora, iterator wyrzuci
ConcurrentModificationException
. W związku z tym, w obliczu jednoczesnej modyfikacji, iterator zawiedzie szybko i czysto, zamiast ryzykować arbitralne, niedeterministyczne zachowanie przy nieokreślonym czas w przyszłości. podczas gdy wyliczenia zwracane przez Klucze Hashtable i metody elements nie są szybkie.HashTable i HashMap są członkami Java Collections Framework (od Java 2 platform v1. 2, HashTable został doposażony w implementację interfejsu Map).
HashTable jest uważany za Kod legacy, dokumentacja zaleca użycie ConcurrentHashMap zamiast Hashtable, jeśli Bezpieczny wątek jest wysoce współbieżny realizacja jest pożądana.
HashMap nie gwarantuje kolejności zwracania elementów. Dla HashTable myślę, że to samo, ale nie jestem do końca pewien, nie uważam ressource, że wyraźnie stwierdzają, że.
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
2012-04-29 13:57:46
HashMap
i Hashtable
mają również znaczące różnice algorytmiczne. Nikt wcześniej o tym nie wspominał, dlatego o tym wspominam. HashMap
zbuduje tabelę hashową o mocy dwóch wielkości, zwiększy ją dynamicznie tak, aby w dowolnym zasobniku było co najwyżej osiem elementów (kolizji) i bardzo dobrze wymieszać elementy dla ogólnych typów elementów. Jednak implementacja Hashtable
zapewnia lepszą i lepszą kontrolę nad hashowaniem, jeśli wiesz, co robisz, a mianowicie możesz naprawić rozmiar tabeli przy użyciu np. najbliższego numeru pierwszego do wartości rozmiar domeny i to spowoduje lepszą wydajność niż HashMap tzn. mniej kolizji w niektórych przypadkach.
Niezależnie od oczywistych różnic omówionych szeroko w tym pytaniu, widzę Hashtable jako" ręczny napęd "samochód, w którym masz lepszą kontrolę nad hashowaniem, a HashMap jako odpowiednik "automatycznego napędu", który ogólnie będzie dobrze 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
2014-01-24 08:35:04
Na podstawie informacji tutaj , polecam korzystanie z HashMap. Myślę, że największą zaletą jest to, że Java uniemożliwi ci modyfikowanie go podczas iteracji, chyba że zrobisz to przez iterator.
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
2008-09-02 20:14:53
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 przekazywania zagregowanych danych. A collections framework W jest jednolitą architekturą do reprezentowania i manipulowania zbiorami.
The HashMap
JDK1.2
i Hashtable JDK1.0
, oba są używane do reprezentowania grupa obiektów reprezentowanych w para <Key, Value>
. Każda para <Key, Value>
nazywana jest Entry
obiektem. Zbiór wpisów jest określany przez obiekt HashMap
i Hashtable
. Klucze w kolekcji muszą być unikalne lub charakterystyczne. [ponieważ są one używane do pobierania zmapowanej wartości określonego klucza. wartości w kolekcji mogą być powielane.]
" Superclass, Legacy and Collection Framework member
Hashtable jest klasą dziedziczoną wprowadzoną w JDK1.0
, która jest podklasa klasy słownika. Z JDK1.2
Hashtable jest przeprojektowany tak, aby zaimplementować interfejs Map , aby stał się członkiem frameworka kolekcji. HashMap jest członkiem Java Collection Framework od samego początku jego wprowadzenia w JDK1.2
. HashMap jest podklasą klasy AbstractMap.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable { ... }
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { ... }
" pojemność początkowa i współczynnik obciążenia
pojemność jest liczbą łyżek w tabeli hash, a początkowa pojemność jest po prostu pojemność w momencie tworzenia tabeli hash. Zwróć uwagę, że tabela hash jest otwarta: w przypadku "hash
collision
", pojedyncze wiadro przechowuje wiele wpisów, które muszą być przeszukiwane sekwencyjnie. Współczynnik obciążenia jest miarą tego, w jaki sposób tabela hash może być pełna, zanim jej pojemność zostanie automatycznie zwiększona.
HashMap tworzy pustą tabelę hashową z domyślną początkową pojemnością (16) oraz domyślny współczynnik obciążenia (0.75). Gdzie jako Hashtable tworzy pustą tabelę hashtable z domyślną początkową pojemnością (11) i współczynnik obciążenia/wypełnienia (0,75).
" modyfikacja konstrukcji w przypadku kolizji haszowej
HashMap
, Hashtable
W przypadku kolizji hash przechowują wpisy mapy w linkowanych listach. from Java8 for HashMap
jeśli hash bucket przekroczy określony próg, to bucket przełączy się z linked list of entries to a balanced tree
. które poprawiają w najgorszym przypadku wydajność od O(n) Do o (log n). Podczas konwersji listy do drzewa binarnego, hashcode jest używany jako zmienna rozgałęziająca. Jeśli w tym samym wiadrze znajdują się dwa różne hashcody, jeden jest uważany za większy i idzie na prawo od drzewa, a drugi na lewo. Ale gdy oba hashcody są równe, HashMap
zakłada, że klucze są porównywalne i porównuje klucz, aby określić kierunek, tak aby można było zachować pewien porządek. Jest to dobra praktyka, aby klucze HashMap
porównywalne . Przy dodawaniu wpisów, jeśli rozmiar wiadra osiągnie TREEIFY_THRESHOLD = 8
Konwertuj połączoną listę wpisów na zrównoważone drzewo, przy usuwaniu wpisów mniejszych niż TREEIFY_THRESHOLD
i co najwyżej UNTREEIFY_THRESHOLD = 6
konwertuje zrównoważone drzewo do połączonej listy wpisów. Java 8 SRC, stackpost
" Kolekcja-Zobacz iteracja, Fail-Fast i Fail-Safe
+--------------------+-----------+-------------+
| | Iterator | Enumeration |
+--------------------+-----------+-------------+
| Hashtable | fail-fast | safe |
+--------------------+-----------+-------------+
| HashMap | fail-fast | fail-fast |
+--------------------+-----------+-------------+
| ConcurrentHashMap | safe | safe |
+--------------------+-----------+-------------+
Iterator
w przyrodzie jest to błąd. i. e rzuca ConcurrentModificationException jeśli kolekcja jest modyfikowana podczas iteracji innej niż własna metoda remove (). Gdzie jako Enumeration
jest bezpieczny w przyrodzie. Nie wyrzuca żadnych WYJĄTKÓW, jeśli kolekcja jest modyfikowana podczas iteracji.
Zgodnie z dokumentami Java API, Iterator jest zawsze preferowany niż wyliczenie.
Uwaga: funkcjonalność interfejsu wyliczeń jest duplikowana przez interfejs iteratora. Dodatkowo Iterator dodaje opcjonalny Usuń operację i ma krótsze nazwy metod. Nowe implementacje powinny rozważyć użycie iteratora zamiast wyliczania.
W Java 5 wprowadziła interfejs ConcurrentMap: ConcurrentHashMap
- Bardzo równoległa, wydajna implementacja ConcurrentMap
wspierana przez tabelę hash. Ta implementacja nigdy nie blokuje podczas pobierania i pozwala klientowi wybrać poziom współbieżności dla aktualizacji. Jest przeznaczony jako zamiennik Hashtable
: oprócz implementacja ConcurrentMap
, obsługuje wszystkie "starsze" metody charakterystyczne dla Hashtable
.
-
Każda wartość
HashMapEntry
S jest lotna , co zapewnia konsystencję drobnoziarnistych zmian i kolejnych odczytów; każdy odczyt odzwierciedla ostatnio ukończoną aktualizację -
Iteratory i wyliczenia są bezpieczne-odzwierciedlają stan w pewnym momencie od utworzenia iteratora/ wyliczenia; pozwala to na jednoczesne odczyty i modyfikacje kosztem zmniejszonej konsystencji. Nie rzucają ConcurrentModificationException. Jednak Iteratory są zaprojektowane tak, aby mogły być używane tylko przez jeden wątek na raz.
-
podobnie jak
Hashtable
, ale w przeciwieństwie doHashMap
, ta klasa nie pozwala na użycie null jako klucza lub wartości.
public static void main(String[] args) {
//HashMap<String, Integer> hash = new HashMap<String, Integer>();
Hashtable<String, Integer> hash = new Hashtable<String, Integer>();
//ConcurrentHashMap<String, Integer> hash = new ConcurrentHashMap<>();
new Thread() {
@Override public void run() {
try {
for (int i = 10; i < 20; i++) {
sleepThread(1);
System.out.println("T1 :- Key"+i);
hash.put("Key"+i, i);
}
System.out.println( System.identityHashCode( hash ) );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override public void run() {
try {
sleepThread(5);
// ConcurrentHashMap traverse using Iterator, Enumeration is Fail-Safe.
// Hashtable traverse using Enumeration is Fail-Safe, Iterator is Fail-Fast.
for (Enumeration<String> e = hash.keys(); e.hasMoreElements(); ) {
sleepThread(1);
System.out.println("T2 : "+ e.nextElement());
}
// HashMap traverse using Iterator, Enumeration is Fail-Fast.
/*
for (Iterator< Entry<String, Integer> > it = hash.entrySet().iterator(); it.hasNext(); ) {
sleepThread(1);
System.out.println("T2 : "+ it.next());
// ConcurrentModificationException at java.util.Hashtable$Enumerator.next
}
*/
/*
Set< Entry<String, Integer> > entrySet = hash.entrySet();
Iterator< Entry<String, Integer> > it = entrySet.iterator();
Enumeration<Entry<String, Integer>> entryEnumeration = Collections.enumeration( entrySet );
while( entryEnumeration.hasMoreElements() ) {
sleepThread(1);
Entry<String, Integer> nextElement = entryEnumeration.nextElement();
System.out.println("T2 : "+ nextElement.getKey() +" : "+ nextElement.getValue() );
//java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode
// at java.util.HashMap$EntryIterator.next
// at java.util.Collections$3.nextElement
}
*/
} catch ( Exception e ) {
e.printStackTrace();
}
}
}.start();
Map<String, String> unmodifiableMap = Collections.unmodifiableMap( map );
try {
unmodifiableMap.put("key4", "unmodifiableMap");
} catch (java.lang.UnsupportedOperationException e) {
System.err.println("UnsupportedOperationException : "+ e.getMessage() );
}
}
static void sleepThread( int sec ) {
try {
Thread.sleep( 1000 * sec );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
" Klucze Null I Wartości Null
HashMap
pozwala na maksymalnie jeden klucz null i dowolną liczbę wartości null. Gdzie jako Hashtable
nie pozwala nawet na pojedynczy klucz null i wartość Null, jeśli klucz lub wartość null jest wtedy rzuca NullPointerException. przykład
" Synchronizowane, Bezpieczne Wątki
Hashtable
jest wewnętrznie zsynchronizowany. Dlatego jest bardzo bezpieczny w użyciu Hashtable
w aplikacjach wielowątkowych. Gdzie as {[5] } nie jest wewnętrznie zsynchronizowany. Dlatego nie jest bezpiecznie używać HashMap
w aplikacjach wielowątkowych bez zewnętrznej synchronizacji. Możesz zewnętrznie zsynchronizować HashMap
za pomocą metody Collections.synchronizedMap()
.
" wydajność
Ponieważ Hashtable
jest wewnętrznie zsynchronizowany, sprawia to, że Hashtable
jest nieco wolniejszy niż HashMap
.
@ Zobacz
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
2020-06-20 09:12:55
W przypadku aplikacji z wątkami często można uniknąć współbieżności-zależy to od wymagań wydajności.
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
2008-09-02 22:38:59
1.Hashmap
i HashTable
zarówno przechowują klucz, jak i wartość.
2.Hashmap
może przechowywać jeden klucz jako null
. Hashtable
nie mogę przechowywać null
.
3.HashMap
nie jest zsynchronizowany, ale Hashtable
jest zsynchronizowany.
4.HashMap
można zsynchronizować z Collection.SyncronizedMap(map)
Map hashmap = new HashMap();
Map map = Collections.SyncronizedMap(hashmap);
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-03-22 15:43:53
Pomijając już wspomniane różnice, należy zauważyć, że od Java 8, HashMap
dynamicznie zastępuje węzły (linked list) używane w każdym wiadrze Treenodami( czerwono-czarnymi drzewami), tak że nawet jeśli występują kolizje high hash, najgorszym przypadkiem podczas wyszukiwania jest
O(log (n)) dla HashMap
Vs O (n) W Hashtable
.
*powyższa poprawa nie została jeszcze zastosowana do Hashtable
, a jedynie do HashMap
, LinkedHashMap
, i ConcurrentHashMap
.
FYI, obecnie
-
TREEIFY_THRESHOLD = 8
: jeśli wiadro zawiera więcej niż 8 węzłów, lista połączona 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 do listy połączonej.
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
2016-05-04 15:04:15
Istnieje 5 podstawowych różnic z HashTable i HashMaps.
- Maps pozwala na iterację i pobieranie kluczy, wartości oraz obu par klucz-wartość, gdzie HashTable nie ma całej tej możliwości.
- w Hashtable znajduje się funkcja contains (), która jest bardzo myląca w użyciu. Ponieważ znaczenie contains jest nieco odbiegające. Czy to znaczy zawiera klucz czy zawiera wartość? ciężko zrozumieć. To samo w Mapach mamy ContainsKey () i Funkcje ContainsValue (), które są bardzo łatwe do zrozumienia.
- w hashmapie można bezpiecznie usunąć element podczas iteracji. gdzie nie jest to możliwe w hashtables.
- Hashtable są domyślnie zsynchronizowane, więc można je łatwo używać z wieloma wątkami. Gdzie jako Hashmapy nie są domyślnie zsynchronizowane, więc mogą być używane tylko z pojedynczym wątkiem. Ale nadal możesz przekonwertować Hashmapę na zsynchronizowaną, używając kolekcji klasy util synchronizedMap (Map m) funkcja.
- HashTable nie zezwala na klucze null ani wartości null. Gdzie jako HashMap pozwala na jeden klucz null i wiele wartości null.
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-04-10 15:44:38
Mój mały wkład:
Pierwsza i najbardziej znacząca różnica między
Hashtable
aHashMap
polega na tym, żeHashMap
nie jest zbiorem bezpiecznym dla wątków, podczas gdyHashtable
jest zbiorem bezpiecznym dla wątków.Drugą ważną różnicą między
Hashtable
iHashMap
jest wydajność, ponieważHashMap
nie jest zsynchronizowana, działa lepiej niżHashtable
.Trzecia różnica na
Hashtable
vsHashMap
jest taka, żeHashtable
jest przestarzałą klasą i powinieneś używaćConcurrentHashMap
zamiastHashtable
w Javie.
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
2020-06-20 09:12:55
HashMap: jest to klasa dostępna w Javie.pakiet util i służy do przechowywania elementu w formacie klucza i wartości.
Hashtable: jest to klasa dziedziczona, która jest rozpoznawana wewnątrz struktury kolekcji.
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-12-28 02:05:18
HashTable jest klasą dziedziczoną w JDK, która nie powinna być już używana. Zastąp jego użycie ConcurrentHashMap . Jeśli nie potrzebujesz bezpieczeństwa wątku, użyj HashMap, który nie jest threadsafe, ale jest szybszy i zużywa mniej pamięci.
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-21 17:27:22
-
Hashtable
jest zsynchronizowany, podczas gdyHashMap
nie jest. - inną różnicą jest to, że iterator w
HashMap
jest bezpieczny dla awarii natomiast licznikHashtable
nie jest. jeśli zmienisz mapę podczas iteracji, będziesz wiedział. -
HashMap
dopuszcza w nim wartości null, podczas gdyHashtable
nie.
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
2019-08-16 19:08:44
HashMap i HashTable
- kilka ważnych punktów na temat HashMap i HashTable. proszę przeczytać poniżej szczegóły.
1) Hashtable i Hashmap implementują Javę.util.Interfejs mapy 2) zarówno Hashmap, jak i Hashtable są kolekcją opartą na hash. i pracuje nad haszowaniem. są to więc podobieństwa HashMap i HashTable.
- Jaka jest różnica między HashMap a HashTable?
1) pierwsza różnica polega na tym, że HashMap nie jest bezpieczny dla wątków Podczas gdy HashTable to ThreadSafe
2) HashMap jest lepszy pod względem wydajności, ponieważ nie jest bezpieczny dla wątków. chociaż wydajność Hashtable wise nie jest lepsza, ponieważ jest bezpieczna dla wątku. tak więc wiele wątków nie może uzyskać dostępu do Hashtable w tym samym 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
2017-07-25 14:59:32
Hashtable:
Hashtable {[8] } jest strukturą danych, która zachowuje wartości pary klucz-wartość. Nie pozwala na null zarówno dla kluczy,jak i wartości. Jeśli dodasz wartość null, otrzymasz NullPointerException
. Jest zsynchronizowany. Więc to wiąże się z jego kosztami. Tylko jeden wątek może uzyskać dostęp do HashTable w określonym czasie.
Przykład :
import java.util.Map;
import java.util.Hashtable;
public class TestClass {
public static void main(String args[ ]) {
Map<Integer,String> states= new Hashtable<Integer,String>();
states.put(1, "INDIA");
states.put(2, "USA");
states.put(3, null); //will throw NullPointerEcxeption at runtime
System.out.println(states.get(1));
System.out.println(states.get(2));
// System.out.println(states.get(3));
}
}
HashMap:
HashMap {[8] } jest podobny do Hashtable, ale akceptuje również parę wartości klucza. Informatyka zezwala na null zarówno dla kluczy,jak i wartości. Jego wydajność jest lepsza niż HashTable
, ponieważ jest unsynchronized
.
Przykład:
import java.util.HashMap;
import java.util.Map;
public class TestClass {
public static void main(String args[ ]) {
Map<Integer,String> states = new HashMap<Integer,String>();
states.put(1, "INDIA");
states.put(2, "USA");
states.put(3, null); // Okay
states.put(null,"UK");
System.out.println(states.get(1));
System.out.println(states.get(2));
System.out.println(states.get(3));
}
}
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
2016-04-26 09:46:16
HashMap i Hashtable są używane do przechowywania danych w postaci klucza i wartości. Oba używają techniki mieszania do przechowywania unikalnych kluczy. ut istnieje wiele różnic między klasami HashMap i Hashtable, które są podane poniżej.
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
2019-10-30 11:32:22
HashMap
jest emulowany i dlatego nadaje się do użytku w GWT client code
, podczas gdy Hashtable
nie jest.
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-07-15 09:54:10
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 by Manish Chhabra
5 głównych różnic betwen HashMap i Hashtable
HashMap i Hashtable implementują Javę.util.Interfejs Map ale tam są pewne różnice, które programiści Javy muszą zrozumieć, aby pisać bardziej wydajny kod. Od Java 2 Platforma v1. 2, Klasa Hashtable został doposażony w implementację interfejsu Mapy, co czyni go członkiem Java Collections Framework.
Jedną z głównych różnic między HashMap i Hashtable jest to, że HashMap nie jest zsynchronizowany, podczas gdy Hashtable jest zsynchronizowany, co oznacza, że Hashtable jest bezpieczny dla wątków i może być współdzielony między wieloma wątków, ale HashMap nie może być współdzielony między wieloma wątkami bez prawidłowa synchronizacja. Java 5 wprowadzona ConcurrentHashMap czyli alternatywą Hashtable i zapewnia lepszą skalowalność niż Hashtable w Javie.Zsynchronizowany oznacza, że tylko jeden wątek może modyfikować hash / align = "left" / Zasadniczo oznacza to, że każdy wątek przed wykonanie aktualizacji na hashtable będzie musiało zdobyć blokadę na obiekt, podczas gdy inni będą czekać na zwolnienie blokady.
Klasa HashMap jest w przybliżeniu równoważna Hashtable, z tą różnicą, że pozwala na null. (HashMap pozwala na null wartości jako klucz i wartość Hashtable nie pozwala na null).
Trzecią istotną różnicą między HashMap a Hashtable jest to, że Iterator w Hashmapie jest iteratorem szybkim, podczas gdy enumerator dla Hashtable nie jest i rzucać ConcurrentModificationException jeśli jakikolwiek inny wątek modyfikuje mapę strukturalnie przez dodanie lub usunięcie dowolnego elementu z wyjątkiem iteratora metoda remove (). Ale nie jest to zachowanie gwarantowane i będzie wykonane przez JVM na best wysiłek. Jest to również ważna różnica pomiędzy wyliczaniem a Iteratorem w Javie.
Jeszcze jedną zauważalną różnicą między Hashtable i HashMap jest to, że ze względu na bezpieczeństwo wątków i synchronizację Hashtable jest znacznie wolniejszy niż HashMap jeśli jest używany w środowisku jednowątkowym. Więc jeśli nie potrzebujesz synchronizacji i HashMap jest używany tylko przez jeden wątek, to się wykonaj Hashtable w Javie.
HashMap nie gwarantuje, że kolejność map pozostanie stała w czasie.
Zauważ, że HashMap może być synchronizowany przez
Map m = Collections.synchronizedMap(hashMap);
Podsumowując istnieją znaczące różnice między Hashtable i HashMap w Javie np. thread-Bezpieczeństwo i szybkość i na tej podstawie tylko użyj Hashtable, jeśli absolutnie potrzebujesz thread-safety, jeśli biegasz Java 5 rozważ użycie ConcurrentHashMap w Javie.
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-08-06 08:04:50