Domanda Differenze tra HashMap e Hashtable?


Quali sono le differenze tra a HashMap e a Hashtable in Java?

Quale è più efficiente per le applicazioni senza thread?


3113
2017-09-02 20:12


origine


risposte:


Ci sono molte differenze tra HashMap e Hashtable in Java:

  1. Hashtable è sincronizzato, mentre HashMap non è. Questo fa HashMap migliore per le applicazioni senza thread, in quanto gli oggetti non sincronizzati generalmente hanno prestazioni migliori rispetto a quelli sincronizzati.

  2. Hashtable non permette null chiavi o valori. HashMap permette uno null chiave e qualsiasi numero di null valori.

  3. Una delle sottoclassi di HashMap è LinkedHashMap, quindi nel caso in cui si desideri un ordine di iterazione prevedibile (che è l'ordine di inserimento per impostazione predefinita), è possibile scambiare facilmente HashMap per un LinkedHashMap. Questo non sarebbe facile se tu stessi usando Hashtable.

Poiché la sincronizzazione non è un problema per te, ti consiglio HashMap. Se la sincronizzazione diventa un problema, puoi anche guardare ConcurrentHashMap.


3203
2017-09-02 23:02



Nota che molte delle risposte indicano che Hashtable è sincronizzato. In pratica, questo ti compra molto poco.  La sincronizzazione è sui metodi accessor / mutator che interromperà due thread aggiungendo o rimuovendo dalla mappa contemporaneamente, ma nel mondo reale avrete spesso bisogno di sincronizzazione aggiuntiva.

Un idioma molto comune è "controllare poi mettere", cioè cercare una voce nella mappa e aggiungerla se non esiste già. Questo non è in alcun modo un'operazione atomica se usi Hashtable o HashMap.

Una HashMap sincronizzata in modo equivalente può essere ottenuta da:

Collections.synchronizedMap(myMap);

Ma per implementare correttamente questa logica è necessario sincronizzazione aggiuntiva della forma:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Anche l'iterazione delle voci di Hashtable (o di una HashMap ottenuta da Collections.synchronizedMap) non è thread-safe a meno che non si protegga anche la Map dalla modifica tramite sincronizzazione aggiuntiva.

Implementazioni del ConcurrentMap interfaccia (per esempio ConcurrentHashMap) risolvere alcuni di questi includendo semantica sicura per il check-then-act ad esempio:

ConcurrentMap.putIfAbsent(key, value);

579
2017-09-03 11:00



Nessuno ha menzionato il fatto Hashtable è non parte di Java Collections Framework: fornisce solo un'API simile. Anche, Hashtable è considerato un codice legacy. Non c'è niente Hashtable che non può essere fatto usando HashMap o derivazioni di HashMap, quindi per il nuovo codice, non vedo alcuna giustificazione per tornare a Hashtable.


287
2018-06-25 01:46



Questa domanda viene spesso posta in intervista per verificare se il candidato comprende il corretto utilizzo delle classi di raccolta ed è a conoscenza delle soluzioni alternative disponibili.

  1. La classe HashMap è approssimativamente equivalente a Hashtable, tranne per il fatto che non è sincronizzata e consente valori nulli. (HashMap consente valori nulli come chiave e valore mentre Hashtable non consente valori nulli).
  2. HashMap non garantisce che l'ordine della mappa rimarrà costante nel tempo.
  3. HashMap non è sincronizzato mentre Hashtable è sincronizzato.
  4. Iterator in HashMap è fail-safe mentre l'enumeratore per Hashtable non lo è e lancia ConcurrentModificationException se qualsiasi altro Thread modifica la mappa strutturalmente aggiungendo o rimuovendo qualsiasi elemento tranne il metodo remove () di Iterator. Ma questo non è un comportamento garantito e verrà svolto da JVM al meglio.

Nota su alcuni termini importanti

  1. Sincronizzato significa che solo un thread può modificare una tabella hash in un determinato momento. In sostanza, significa che qualsiasi thread prima di eseguire un aggiornamento su un hashtable dovrà acquisire un blocco sull'oggetto mentre altri attenderanno il rilascio del blocco.
  2. Fail-safe è rilevante dal contesto degli iteratori. Se un iteratore è stato creato su un oggetto di raccolta e qualche altro thread tenta di modificare l'oggetto di raccolta "structurally", verrà generata un'eccezione di modifica simultanea. È possibile che altri thread invochino il metodo "set" poiché non modifica "strutturalmente" la raccolta. Tuttavia, se prima di chiamare "set", la raccolta è stata modificata strutturalmente, verrà lanciata "IllegalArgumentException".
  3. Per modifica strutturale si intende l'eliminazione o l'inserimento di elementi che potrebbero effettivamente modificare la struttura della mappa.

HashMap può essere sincronizzato da

Map m = Collections.synchronizeMap(hashMap);

Map fornisce viste Collection invece del supporto diretto per l'iterazione  tramite oggetti di enumerazione. Le viste di raccolta migliorano notevolmente il  espressività dell'interfaccia, come discusso più avanti in questa sezione.  Mappa ti consente di scorrere le chiavi, i valori o le coppie chiave-valore;  Hashtable non fornisce la terza opzione. La mappa fornisce un modo sicuro  rimuovere le voci nel mezzo dell'iterazione; Hashtable no.  Infine, Map corregge una carenza minore nell'interfaccia Hashtable.  Hashtable ha un metodo chiamato contains, che restituisce true se il  Hashtable contiene un determinato valore. Dato il suo nome, ti aspetteresti questo  metodo per restituire true se Hashtable conteneva una determinata chiave, perché  la chiave è il meccanismo di accesso principale per un Hashtable. La mappa  l'interfaccia elimina questa fonte di confusione rinominando il metodo  containsValue. Inoltre, questo migliora la coerenza dell'interfaccia -  containsValue parallels containsKey.

L'interfaccia della mappa


148
2017-10-04 06:39



HashMap: Un'implementazione del Map interfaccia che utilizza i codici hash per indicizzare un array. Hashtable: Ciao, il 1998 ha chiamato. Vogliono indietro le loro API delle collezioni.

Seriamente però, è meglio stare lontano da Hashtable del tutto. Per le app a thread singolo, non è necessario il sovraccarico extra della sincronizzazione. Per le applicazioni altamente concorrenti, la sincronizzazione paranoide potrebbe portare a carestie, deadlock o pause inutili di raccolta dei dati inutili. Come ha notato Tim Howland, potresti usare ConcurrentHashMap anziché.


107
2017-09-02 23:14



Tieni presente che HashTable era una classe legacy prima che Java Collections Framework (JCF) venisse introdotto e successivamente fu riadattato per implementare il Map interfaccia. Così è stato Vector e Stack.

Pertanto, tieniti sempre lontano da loro nel nuovo codice poiché c'è sempre un'alternativa migliore nella JCFcome altri avevano sottolineato.

Ecco il Scheda cheat di raccolta Java che troverai utile. Notare che il blocco grigio contiene la classe legacy HashTable, Vector e Stack.

enter image description here


104
2018-03-25 08:58



Oltre a ciò che izb ha detto, HashMap consente valori nulli, mentre il Hashtable non.

Si noti inoltre che Hashtable estende il Dictionary classe, che come il javadocs stato, è obsoleto ed è stato sostituito dal Map interfaccia.


58
2017-09-02 20:30



Dai un'occhiata a questo grafico. Fornisce confronti tra diverse strutture di dati insieme a HashMap e Hashtable. Il confronto è preciso, chiaro e facile da capire.

Java Collection Matrix


50
2017-11-20 05:35



Hashtable è simile al HashMap e ha un'interfaccia simile Si consiglia di utilizzare HashMap, a meno che non si richieda il supporto per le applicazioni legacy o sia necessaria la sincronizzazione, come Hashtables i metodi sono sincronizzati. Quindi nel tuo caso in quanto non sei multi-threading, HashMaps sono la soluzione migliore.


39
2017-09-02 20:25



Un'altra differenza fondamentale tra hashtable e hashmap è che Iterator in HashMap è fail-fast mentre l'enumeratore per Hashtable non lo è e lancia ConcurrentModificationException se qualsiasi altro Thread modifica la mappa strutturalmente aggiungendo o rimuovendo qualsiasi elemento tranne il metodo remove () di Iterator. Ma questo non è un comportamento garantito e verrà svolto da JVM al meglio. "

La mia fonte: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


31
2017-09-08 06:40