Differenza tra HashSet e HashMap?


168

A parte il fatto che HashSetnon consente valori duplicati, qual è la differenza tra HashMape HashSet?

Voglio dire implementazione saggia? È un po 'vago perché entrambi usano le tabelle hash per memorizzare i valori.


HashSet è implementato usando HashMap
therealprashant

Penso che sapere perché HashSet è diverso da ArrayList vi aiuterà a capire la risposta alla tua domanda di cui sopra: stackoverflow.com/questions/18706870/...
djangofan

Risposte:


150

Sono costrutti completamente diversi. A HashMapè un'implementazione di Map. Una mappa associa le chiavi ai valori. La ricerca della chiave avviene utilizzando l'hash.

D'altra parte, a HashSetè un'implementazione di Set. Un set è progettato per abbinare il modello matematico di un set. A HashSetusa a HashMapper sostenere la sua implementazione, come hai notato. Tuttavia, implementa un'interfaccia completamente diversa.

Quando stai cercando quale sarà il migliore Collectionper i tuoi scopi, questo tutorial è un buon punto di partenza. Se vuoi davvero sapere cosa sta succedendo, c'è anche un libro per quello .


Questa affermazione è un po 'semplicistica. Ce ne sono altri in corso sotto le copertine, "" Restituisce un valore hash per l'oggetto specificato. Oltre al codice hash dell'oggetto stesso, questo metodo applica una "funzione hash supplementare" che difende dalle funzioni hash di scarsa qualità. Questo è fondamentale perché HashMap utilizza tabelle hash di due lunghezze di potenza. " Weblogs.java.net/blog/2005/06/18/hashmap-implementation - tuttavia, se guardi il documento vedrai che questo hash distribuisce le cose su "bucket", quindi alla fine credo che due cose possano essere mappate nello stesso bucket.
Justkt

1
Per rispondere alla tua seconda domanda - no. Una mappa è se vuoi (chiave -> valore) come definito dall'eccellente risposta di @Bruno Rothgiesser. Un set è per elementi non duplicati. Se vuoi duplicati e non valore chiave->, verificherei un'implementazione java.util.List. Guarda il tutorial sulla raccolta per una guida definitiva: java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk: sì, puoi ottenere due chiavi in ​​un secchio e quindi equals () viene usato per distinguerle. Ecco perché è essenziale che hashCode () e equals () siano compatibili.
Michael Borgwardt,

6
@SpikETidE: né HashMap né HashSet consentono duplicati. Questo è il punto.
Michael Borgwardt,

23
@SpikETidE: un set non ha coppie chiave / valore, solo elementi. E HashSet è implementato avendo una HashMap con gli elementi impostati come chiavi e il valore che viene ignorato.
Michael Borgwardt,

300

HashSet è un set , ad esempio {1,2,3,4,5}

HashMap è una mappa chiave -> valore (chiave per valore), ad es. {A -> 1, b -> 2, c -> 2, d -> 1}

Nota nel mio esempio sopra che nella HashMap non devono esserci chiavi duplicate, ma può avere valori duplicati.

Nel HashSet non devono essere presenti elementi duplicati.


Ma il (più interessante) motivo della confusione è che anche in HashSet è necessaria una "chiave" per accedere agli elementi. Cioè, gli oggetti, anche in matematica, hanno nomi (o indirizzi), se devono essere accessibili o referenziati. Quindi in questo senso reale un HashSet è un HashMap particolarmente semplice, codificato con i nomi (o gli indirizzi) dei suoi elementi.
Andrew Marshall,

65

HashSet

  1. La classe HashSet implementa l'interfaccia Set
  2. In HashSet, memorizziamo oggetti (elementi o valori) ad es. Se abbiamo un HashSet di elementi stringa, potrebbe rappresentare un insieme di elementi HashSet: {"Hello", "Hi", "Bye", "Run"}
  3. HashSet non consente elementi duplicati, il che significa che non è possibile memorizzare valori duplicati in HashSet.
  4. HashSet consente di avere un singolo valore null.
  5. HashSet non è sincronizzato, il che significa che non sono adatti per operazioni thread-safe fino a quando non sono sincronizzati esplicitamente. [Somiglianza]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. La classe HashMap implementa l'interfaccia Mappa
  2. HashMap viene utilizzato per la memorizzazione di coppie chiave e valore. In breve, mantiene la mappatura di chiave e valore (la classe HashMap è approssimativamente equivalente a Hashtable, tranne per il fatto che non è sincronizzata e consente valori null). Ecco come si potrebbero rappresentare gli elementi di HashMap se ha chiave intera e valore di tipo String: ad es. {1 -> "Ciao", 2 -> "Ciao", 3 -> "Ciao", 4 -> "Esegui"}
  3. HashMap non consente chiavi duplicate ma consente di avere valori duplicati.
  4. HashMap consente una singola chiave null e un numero qualsiasi di valori null.
  5. HashMap non è sincronizzato, il che significa che non sono adatti per operazioni thread-safe fino a quando non sono sincronizzati esplicitamente. [Somiglianza]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

Si prega di fare riferimento a questo articolo per trovare ulteriori informazioni.


36

È davvero un peccato che entrambi i loro nomi inizino con Hash . Questa è la parte meno importante di loro. Le parti importanti vengono dopo l' Hash : il Set e la Mappa , come altri hanno sottolineato. Ciò che sono, rispettivamente, sono un set - una raccolta non ordinata - e una mappa - una raccolta con accesso con chiave. Capita di essere implementati con hash - ecco da dove vengono i nomi - ma la loro essenza è nascosta dietro quella parte dei loro nomi.

Non essere confuso dai loro nomi; sono cose profondamente diverse.


@HiteshSahu Entrambi sono implementati con Hash Tables ( en.wikipedia.org/wiki/Hash_table ). Questa è una buona struttura di dati per rappresentare un set, efficiente nei modi giusti e, in sostanza, le chiavi di un HashMap sono implementate come un HashSet. Quindi chi li ha nominati ha avuto qualche problema per implementarli e si è concentrato sull'implementazione piuttosto che sul loro scopo (a una supposizione).
Carl Manaster,

1
Ben spiegato. Grazie.
user3932000,

5

Gli Hashsetattrezzi interni HashMap. Se vedi l' implementazione interna, i valori inseriti in HashSet sono memorizzati come chiavi in ​​HashMap e il valore è un oggetto fittizio della classe Object.
La differenza tra HashMap vs HashSet è: -

  1. HashMap contiene coppie di valori-chiave e ogni valore è accessibile dalla chiave dove HashSet deve essere ripetuto ogni volta in quanto non esiste un metodo get.
  2. HashMapimplementa l'interfaccia Mappa e consente un valore null come chiave e più valori null come valori. Se HashSetimplementa Imposta interfaccia, consente solo un valore null e nessun valore duplicato. (Ricorda una chiave null consentita nella chiave HashMap quindi un valore null in HashSet come HashSet implementa HashMap internamente).
  3. HashSete HashMapnon mantiene l'ordine di inserimento durante l'iterazione.

3

HashSet ci consente di archiviare oggetti nel set dove HashMap ci consente di memorizzare oggetti sulla base di chiave e valore. Ogni oggetto o oggetto memorizzato avrà la chiave.


2

Come suggeriscono i nomi, un HashMap è una mappa associativa (mappatura da una chiave a un valore), un HashSet è solo un Set .


2
@SpikETidE Questo è un dettaglio di come viene implementata l'unicità, ma il significato di HashSet è implementare un set.
Michael Borgwardt,

1
quindi .. tutto si riduce a "se non vuoi duplicati usa hashSet ... Se non ti preoccupi dei duplicati usa HashMap" ....?
SpikETidE

3
Java non implementa una classe specifica per una "raccolta con elementi potenzialmente duplicati" (una "borsa"), puoi usare una Lista per questo (sebbene una Lista aggiunga un po 'di semantica alla borsa: ordine; ma puoi ignorarlo).
leonbloy,

2

Differenze tra HashSet e HashMap in Java

1) La prima e più significativa differenza tra HashMap e HashSet è che HashMap è un'implementazione dell'interfaccia Map mentre HashSet è un'implementazione dell'interfaccia Set, il che significa che HashMap è una struttura di dati basata su valori chiave e HashSet garantisce l'unicità non consentendo duplicati. realtà HashSet è un wrapper per HashMap in Java, se guardi il metodo code of add (E e) di HashSet.java vedrai il seguente codice:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

dove mettere l'oggetto nella mappa come chiave e valore è un oggetto finale PRESENTE che è fittizio.

2) La seconda differenza tra HashMap e HashSet è che usiamo il metodo add () per mettere gli elementi in Set ma usiamo il metodo put () per inserire chiave e valore in HashMap in Java.

3) HashSet consente solo una chiave null, ma HashMap può consentire una chiave null + più valori null.

Questo è tutto sulla differenza tra HashSet e HashMap in Java. In breve, HashSet e HashMap sono due diversi tipi di Collection, uno impostato e l'altro Map.


2

Differenze tra HashSet e HashMap in Java

HashSet utilizza internamente HashMap per archiviare oggetti. Quando aggiunge il metodo (String) chiamato chiama il metodo put (chiave, valore) HahsMap dove key = String object & value = new Object (Dummy). Quindi non mantiene duplicati perché le chiavi non sono altro che Valore Oggetto.

gli oggetti che sono memorizzati come chiave in Hashset / HashMap dovrebbero sovrascrivere hashcode e uguale a contratto.

Le chiavi utilizzate per accedere / archiviare oggetti valore in HashMap devono essere dichiarate come Final perché, quando viene modificato, l'oggetto valore non può essere individuato e restituisce null.


1

A HashMapè quello di aggiungere, ottenere, rimuovere, ... oggetti indicizzati da una chiave personalizzata di qualsiasi tipo.
A HashSetè quello di aggiungere elementi, rimuovere elementi e verificare la presenza di elementi confrontando i loro hash.

Quindi una HashMap contiene gli elementi e un HashSet ricorda i loro hash.


1
Confrontando i loro hash e chiamando i loro equals()metodi.
Marchese di Lorne,

1

Differenze: rispetto all'erarchia: HashSet implementa Set. HashMap implementa Map e memorizza un mapping di chiavi e valori.

Un uso di HashSet e HashMap rispetto al database ti aiuterebbe a capire il significato di ciascuno.
HashSet: viene generalmente utilizzato per la memorizzazione di oggetti di raccolta univoci. Ad esempio: potrebbe essere utilizzato come classe di implementazione per l'archiviazione di una relazione di relazione multipla tra l'
oggetto di classe e l'offerta di classe in cui (l'articolo ha molte offerte) Mappa hash: viene utilizzata per mappare una chiave al valore.Il valore può essere nullo o qualsiasi oggetto / list of Object (che è l'oggetto in sé).



0

Un HashSet utilizza una HashMap internamente per memorizzare le sue voci. Ogni voce nella HashMap interna è codificata da un singolo Oggetto, quindi tutte le voci hanno l'hash nello stesso bucket. Non ricordo ciò che HashMap interno utilizza per archiviare i suoi valori, ma non importa perché il contenitore interno non conterrà mai valori duplicati.

EDIT : Per rispondere al commento di Matthew, ha ragione; L'ho avuto al contrario. La HashMap interna è codificata con gli oggetti che compongono gli elementi Set . I valori di HashMap sono un oggetto che è semplicemente memorizzato nei secchi di HashMap.


Non è giusto. Gli elementi impostati vengono utilizzati direttamente come chiavi HashMap.
Matthew Flaschen,

0

HashMapè Mapun'implementazione che consente valori duplicati ma non chiavi duplicate. . Per aggiungere un oggetto è necessaria una coppia chiave / valore. Sono consentite chiavi Null e valori Null. per esempio:

{The-> 3, mondo-> 5, è-> 2, bello-> 4}

HashSetè Setun'implementazione, che non consente i duplicati . Se si è tentato di aggiungere un oggetto duplicato, una chiamata al public boolean add(Object o)metodo, il set rimane invariato e ritorna false. per esempio:

[Il mondo, è, bello]


-1

hai praticamente risposto alla tua domanda - hashset non consente valori duplicati. sarebbe banale costruire un hashset usando una hashmap di supporto (e solo un controllo per vedere se il valore esiste già). immagino che le varie implementazioni java lo facciano o implementino del codice personalizzato per farlo in modo più efficiente.


1
@oedo - java.util.HashSetdice che è supportato da a java.util.HashMap.
solo

2
Non consentire i duplicati non fa differenza.
Marchese di Lorne,

-1

Fondamentalmente in HashMap, l'utente deve fornire sia la chiave che il valore, mentre in HashSet fornisci solo il valore, la chiave viene derivata automaticamente dal valore utilizzando la funzione hash. Quindi, dopo avere sia Key che Value, HashSet può essere memorizzato come HashMap internamente.


La chiave è il valore in un HashSet.
Marchese di Lorne,

-1

HashSet e HashMap entrambe le coppie di negozi, la differenza sta nel fatto che in HashMap è possibile specificare una chiave mentre in HashSet la chiave proviene dal codice hash dell'oggetto


Se ciò fosse vero, HashSet non potrebbe archiviare più oggetti con lo stesso hashCode e lo fa.
Marchese di Lorne,

-1

HashMapsconsentire una chiave nulla e valori null. Non sono sincronizzati, il che aumenta l'efficienza. Se necessario, è possibile sincronizzarli utilizzandoCollections.SynchronizedMap()

Hashtables non consentire chiavi null e sono sincronizzate.


Non chiese a Hashtables. Non risponde alla domanda
Marchese di Lorne,

-2

HashMap è un'implementazione dell'interfaccia Map HashSet è un'implementazione di Set Interface

HashMap Memorizza i dati sotto forma di coppia valore-chiave HashSet Store solo oggetti

Il metodo Put viene utilizzato per aggiungere elementi nella mappa Il metodo Aggiungi viene utilizzato per aggiungere elementi è Set

Nella mappa hash il valore hashcode viene calcolato utilizzando l'oggetto chiave Qui l'oggetto membro viene utilizzato per calcolare il valore hashcode che può essere lo stesso per due oggetti, quindi il metodo equal () viene utilizzato per verificare l'uguaglianza se restituisce false, il che significa che due oggetti sono diversi.

HashMap è più veloce di hashset perché viene utilizzata una chiave univoca per accedere all'oggetto HashSet è più lento di Hashmap


1
Hanno prestazioni sostanzialmente identiche e "perché viene utilizzata la chiave univoca" non è corretto.
Marchese di Lorne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.