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?

Author: Steve Chambers, 2008-09-02

30 answers

Istnieje kilka różnic między HashMap oraz Hashtable w języku Java:

  1. Hashtable jest zsynchronizowane , podczas gdy HashMap nie jest. To sprawia, że HashMap jest lepszy dla aplikacji bez wątków, ponieważ niezsynchronizowane obiekty zwykle działają lepiej niż zsynchronizowane.

  2. Hashtable nie zezwala null na klucze ani wartości. HashMap pozwala na jeden klucz null i dowolną liczbę wartości null.

  3. 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 na LinkedHashMap. 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.

 3897
Author: Josh Brown,
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);
 707
Author: serg10,
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.

 376
Author: aberrant80,
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ń.

  1. klasa HashMap jest mniej więcej równoważna Hashtable, z tym wyjątkiem, że nie jest zsynchronizowana i pozwala na null. (HashMap zezwala na wartości null jako klucz i wartość, podczas gdy Hashtable nie zezwala nulls).
  2. HashMap nie gwarantuje, że kolejność mapy pozostanie stała w czasie.
  3. HashMap jest nie zsynchronizowany, podczas gdy {[1] } jest zsynchronizowany.
  4. Iterator w HashMap jest bezpieczny, podczas gdy enumerator dla Hashtable nie jest I throw ConcurrentModificationException jeśli jakikolwiek inny wątek modyfikuje strukturę mapy poprzez dodanie lub usunięcie dowolnego elementu z wyjątkiem własnej metody Iterator. Ale nie jest to zachowanie gwarantowane i zostanie wykonane przez JVM z najlepszym wysiłkiem.

Uwaga na niektóre ważne terminy:

  1. 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.
  2. 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łaniem set, zbiór został strukturalnie zmodyfikowany, IllegalArgumentException zostanie wyrzucony.
  3. 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.

Interfejs Mapy

 201
Author: sravan,
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.

Poważnie, lepiej trzymać się z dala od tego wszystkiego. W przypadku aplikacji jednowątkowych nie potrzebujesz dodatkowych kosztów synchronizacji. W przypadku wysoce równoległych aplikacji paranoiczna synchronizacja może prowadzić do głodu, blokad lub niepotrzebnych przerw w zbieraniu śmieci. Jak zauważył Tim Howland, możesz zamiast tego użyj ConcurrentHashMap.
 134
Author: Apocalisp,
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.

Tutaj wpisz opis obrazka

 130
Author: pierrotlefou,
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

  1. 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.
  2. HashMap pozwala na jeden klucz null i wiele wartości null.
  3. HashMap to nowa klasa wprowadzona w JDK 1.2.
  4. HashMap jest szybki.
  5. możemy zrobić HashMap jako zsynchronizowane przez wywołanie tego kodu
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap jest przemieszczany przez Iterator.
  7. Iterator w {[0] } jest Fail-fast.
  8. HashMap dziedziczy klasę AbstractMap.

Hashtable

  1. Hashtable jest zsynchronizowany. Jest bezpieczny dla wątków i może być współdzielony z wieloma wątkami.
  2. Hashtable nie pozwala na użycie żadnego klucza lub wartości null.
  3. Hashtable jest klasą dziedziczną.
  4. Hashtable jest powolny.
  5. Hashtable jest wewnętrznie zsynchronizowana i nie może być niesynchronizowana.
  6. Hashtable jest przemieszczana przez Enumerator i Iterator.
  7. wyliczenie w {[1] } nie jest szybkie.
  8. Hashtable dziedziczy klasę słownika.

Czytaj dalej Jaka jest różnica między HashMap a Hashtable w Javie?

Tutaj wpisz opis obrazka

 74
Author: roottraveller,
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.

 67
Author: matt b,
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.

Macierz Kolekcji Java

 65
Author: Sujan,
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.

 51
Author: Miles D,
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

 36
Author: Neerja,
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... :(

Czy ulepszenia kolekcji Project Coin będą w JDK8?

 36
Author: pwes,
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.

 35
Author: izb,
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.

 30
Author: alain.janinm,
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ł.

 30
Author: SkyWalker,
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.

 28
Author: pkaeding,
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ę. Collections 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).

Mapa Hash & Hashtable

" 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 do HashMap, 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

 25
Author: Yash,
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.

 18
Author: Tim Howland,
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);
 17
Author: Rahul Tripathi,
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.
 16
Author: Kostas Chalkias,
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.

  1. Maps pozwala na iterację i pobieranie kluczy, wartości oraz obu par klucz-wartość, gdzie HashTable nie ma całej tej możliwości.
  2. 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.
  3. w hashmapie można bezpiecznie usunąć element podczas iteracji. gdzie nie jest to możliwe w hashtables.
  4. 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.
  5. HashTable nie zezwala na klucze null ani wartości null. Gdzie jako HashMap pozwala na jeden klucz null i wiele wartości null.
 14
Author: user1923551,
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:

  1. Pierwsza i najbardziej znacząca różnica między Hashtable a HashMap polega na tym, że HashMap nie jest zbiorem bezpiecznym dla wątków, podczas gdy Hashtable jest zbiorem bezpiecznym dla wątków.

  2. Drugą ważną różnicą między Hashtable i HashMap jest wydajność, ponieważ HashMap nie jest zsynchronizowana, działa lepiej niż Hashtable.

  3. Trzecia różnica na Hashtable vs HashMap jest taka, że Hashtable jest przestarzałą klasą i powinieneś używać ConcurrentHashMap zamiast Hashtable w Javie.

 13
Author: Shreyos Adikari,
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.

 11
Author: Ankit,
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.

 10
Author: jontejj,
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
  1. Hashtable jest zsynchronizowany, podczas gdy HashMap nie jest.
  2. inną różnicą jest to, że iterator w HashMap jest bezpieczny dla awarii natomiast licznik Hashtable nie jest. jeśli zmienisz mapę podczas iteracji, będziesz wiedział.
  3. HashMap dopuszcza w nim wartości null, podczas gdy Hashtable nie.
 10
Author: raja,
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.

 9
Author: JegsVala,
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));

    }
}
 8
Author: IntelliJ Amiya,
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.

Tutaj wpisz opis obrazka

 7
Author: DeC,
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.

 5
Author: pong,
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.

  1. 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.

  2. 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).

  3. 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.

  4. 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.

  5. 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.

 5
Author: Night0,
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