2012-08-16 15 views
22

Come specificato nella documentazione JDK, Hashtable non consente chiavi o valori nulli. HashMap consente una chiave nullo e un numero qualsiasi di valori nulli. Perchè è questo?Perché Hashtable non consente chiavi o valori Null?

+0

perché la chiave non può essere duplicata in una singola mappa. –

+2

Forse questa [risposta] (http://stackoverflow.com/a/7556445/579828) ti aiuterà. – Vic

+4

L'Hashtable vuole imporre un contratto in questo modo. Questo contratto garantisce che il metodo get (.) Applicato a una tabella hash restituirà null se e solo se la chiave non è nella mappa. –

risposta

28

Hashtable è la classe precedente e il suo utilizzo è generalmente scoraggiato. Forse hanno visto la necessità di una chiave nulla e, cosa più importante, di valori null e l'hanno aggiunta all'implementazione di HashMap.

HashMap è più recente e ha funzionalità più avanzate, che sono fondamentalmente solo un miglioramento della funzionalità Hashtable. Quando HashMap è stato creato, è stato specificamente progettato per gestire valori null come chiavi e li gestisce come un caso speciale.

Modifica

Da HashtableJavaDoc:

Per memorizzare con successo e recuperare oggetti da un Hashtable, gli oggetti utilizzati come chiavi devono implementare il metodo hashCode e il metodo equals.

Dal null non è un oggetto, non è possibile chiamare o .equals().hashCode() su di esso, in modo che il Hashtable non può calcolare un hash da utilizzare come chiave.

+15

['ConcurrentHashMap'] (http: //docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html) è una nuova classe ma ha anche la restrizione di non consentire chiavi o valori nulli. Aggiungono questa restrizione per motivi di prestazioni dal momento che è molto lavoro extra per supportare chiavi e valori nulli ma probabilmente non è utile la maggior parte delle volte. – DaoWen

+0

Dalla risposta mi aspettavo un motivo per Why Hashtable non consente chiavi o valori null? Anche se stai suggerendo sempre di più. –

3

Perché in HashTable quando si inserisce un elemento verrà preso in considerazione l'hash della chiave e del valore. In sostanza si avrà qualcosa di simile:

public Object put(Object key, Object value){ 

key.hashCode(); 

etc... 

value.hashCode(); 

} 

Mentre in HashMap se si tratta di nulla che calcolerà la chiave in base al valore. Tuttavia, personalmente non mi piace aggiungere la chiave null.

2

Il motivo è il motivo della risposta accettata: Hashtable è vecchio.

Tuttavia, l'utilizzo di Hashtable NON è scoraggiato a favore di HashMap in ogni scenario.

  • Hashtable è sincronizzato, quindi è THREAD-SAFE. HashMap non lo è.

Né Hashtable né ConcurrentHashMap supportano chiavi o valori nulli. HashMap lo fa.

Se si desidera una sostituzione drop-in che non richiede altro che modificare la classe e funziona in ogni scenario, non ce n'è. L'opzione più simile sarebbe ConcurrentHashMap (che è thread-safe, ma non supporta il blocco dell'intera tabella):

Questa classe è completamente interoperabile con Hashtable in programmi che fanno affidamento sulla sua sicurezza filo ma non sulla sua sincronizzazione dettagli.

HashMap è un sostituto migliore per applicazioni a thread singolo o qualsiasi sincronizzazione temporale non è un requisito, a causa della sincronizzazione dell'impatto delle prestazioni.

Fonti:

+0

ConcurrentHashMap put: esegue il mapping della chiave specificata sul valore specificato in questa tabella. Né la chiave né il valore possono essere nulli. Per favore, rivedi la tua risposta. –

+0

oops! Grazie per il testa a testa! Sono andato per l'ovvio e ho pensato che l'unica differenza tra ConcurrentHashMap e HashMap era la sicurezza del thread. Non è la prima volta che è successo. Che convenzione di denominazione akward! – NotGaeL

-1

HashTable - Non consente chiavi a NULL
Questo perché, in put (chiave K, valore V metodo, abbiamo key.hashcode() quale th righe eccezione del puntatore nullo.
TabellaHash - Non consente valore nullo
Questo perché, in put (chiave K, valore V) Metodo abbiamo if(value==null){throw new NullPointerException

HashMap consente valori nulli in quanto non ha alcun controllo come HashTable, mentre consente solo una chiave nulla. Questo viene fatto con l'aiuto del metodo putForNullKey, che aggiungono il valore all'indice 0th dell'array interno ogni volta che la chiave viene fornita come nullo

+0

Il nome della classe è java.util.Hashtable non "HashTable"! –

0

così concludere

Perché nel HashTable quando mettete un elemento esso terrà conto dell'hash delle chiavi e dei valori. In sostanza si avrà qualcosa di simile:

public Object put(Object key, Object value){ 

    key.hashCode(); 

    //some code 

    value.hashCode(); 

} 

HashTable - Non consente chiavi nulli Questo perché, a put (chiave K, valore V) metodo, abbiamo key.hashcode() che getta un'eccezione di puntatore nullo. HashTable - Non consente valore nullo Questo perché, a put (chiave K, valore V) Metodo abbiamo se (valore == null) {throw new NullPointerException

HashMap consente valori nulli in quanto non hanno qualsiasi controllo come HashTable, mentre consente solo una chiave nulla. Questo viene fatto con l'aiuto del metodo putForNullKey, che aggiungono il valore all'indice 0th dell'array interno ogni volta che la chiave viene fornita come nullo

0

tabella hash è molto vecchia classe, da JDK 1.0

Per capire questo, prima di tutto dobbiamo capire i commenti scritti su questa classe dall'autore. "Questa classe implementa una tabella hash, che associa le chiavi ai valori. Qualsiasi oggetto non nullo può essere utilizzato come chiave o come valore. Per successo memorizzare e recuperare gli oggetti da una tabella hash, gli oggetti utilizzati come chiavi devono implementare il metodo hashCode e il metodo equals.”

classe Hashtable è implementato su hashing meccanismo, che è significa per memorizzare qualsiasi coppia chiave-valore, il suo codice hash richiesto dell'oggetto chiave. Se la chiave sarebbe null, non sarà in grado di dare hash, sarà attraverso l'eccezione del puntatore nullo e caso simile per il valore sta lanciando null se il valore è nullo.

Ma in seguito ci si è resi conto che la chiave e il valore nulli hanno la propria importanza che è perché una chiave nulla e valori null multipli sono consentiti nelle classi implementate successivamente come la classe HashMap.

Per le chiavi NULL hash map è consentito e vi è un controllo Null per le chiavi se la chiave è null, quell'elemento verrà archiviato in una posizione zero nell'array Entry. chiave nulla che possiamo usare per qualche valore di default ..

=> I metodi di Hashtable sono sincronizzati e non utilizzano mai il blocco basato su oggetti.

HashMap implementa considerandolo speciale

static final int hash(Object key) { 
     int h; 
     return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16); 
    } 

Java 8 non si può dedurre tipi di tabella di hash.

private Map<String,String> hashtable = new Hashtable<>(); // Not Allowed 

private Map<String,String> hashtable = new HashMap<>(); // Allowed 
Problemi correlati