2015-05-04 9 views
11

HashSet viene implementato usando HashMap e quando aggiungiamo qualcosa dice e1 a HashSet, internamente aggiunge (e1, nuovo Object()) in HashMap se e1 non era presente nel set. La mia domanda è perché stanno inserendo un nuovo Object(), quando potrebbero essere inseriti come (e1, null), che è un approccio più ottimizzato in quanto non vengono creati nuovi oggetti. C'è qualche svantaggio nell'inserire null qui?Perché l'implementazione interna di HashSet crea oggetti fittizi da inserire come valori in HashMap piuttosto che inserire valori null?

+0

Non aggiunge nuovi oggetti. Aggiunge un singolo, che viene utilizzato come indicatore della presenza di un valore nel set. Leggi il codice sorgente. –

+0

In Java 8, hanno cambiato in oggetto statico finale privato PRESENT = new Object(); , che è il valore. – Sandeep

+0

non ci sono risultati in termini di prestazioni perché l'oggetto è statico finale quindi è solo una costante e funzionerà come valore fittizio – Prashant

risposta

11

A HashSet non aggiunge un nuovo Object ogni volta che una nuova chiave è put nella mappa. Utilizza uno Object, ma usa lo stesso Object ogni volta. Questo valore è denominato PRESENT nel codice sorgente HashSet.

Il metodochiama put(key, PRESENT) sul numero interno HashMap. Il metodo remove chiama remove(key) sul numero interno HashMap, ma deve restituire un boolean che indica se la chiave era presente. Se null sono stati memorizzati come valore, il HashSet dovrebbe chiamare prima containsKey, quindi remove, per determinare se la chiave era presente - sovraccarico aggiuntivo. Qui, c'è solo il sovraccarico di memoria di uno Object, che è piuttosto minimale.

0

E.g. se si assegna un oggetto HashSet al costruttore ConcurrentSkipListSet, non può contenere valori nulli.

2

Ho appena guardato il codice sorgente e ho visto questo codice

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

public boolean remove(Object o) { 
    return map.remove(o)==PRESENT; 
} 

Questi non funzionerebbero se null vengono usati al posto di PRESENT; in ogni caso, sarebbe necessario un ulteriore passaggio.

Problemi correlati