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?
risposta
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.
E.g. se si assegna un oggetto HashSet al costruttore ConcurrentSkipListSet, non può contenere valori nulli.
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.
- 1. Come inserire valori NULL usando PDO?
- 2. Inserire valori NA in dataframe
- 3. Inserire valori esadecimali in MySql
- 4. inserire valori univoci per postgresql
- 5. Come inserire valori "NULL" nel database PostgreSQL usando Python?
- 6. Perché HashMap è più veloce di HashSet?
- 7. Come inserire valori predefiniti nella tabella SQL?
- 8. Come inserire valori nell'archivio in extjs
- 9. Inserire più valori nel vettore
- 10. Incremento auto SQLite - Come inserire valori?
- 11. Inserire valori nell'array multidimensionale php
- 12. valori inserire in righe specifiche con SQL
- 13. Modifica dei valori in HashSet
- 14. Utilizzo di JSTL come "inserire" un valore in una HashMap
- 15. Come inserire valori nel dizionario C# sull'istanza?
- 16. Inserire più valori in una colonna mysql?
- 17. Inserire valori con quotazione singola in PostgreSQL
- 18. Inserire valori distinti da una tabella in un'altra tabella
- 19. Come evitare di inserire valori duplicati in un array Perl
- 20. Come inserire più valori di checkbox in una tabella?
- 21. Come inserire record in SQL con valori cercati?
- 22. inserire più righe di valori predefiniti in una tabella
- 23. Java: HashSet vs. HashMap
- 24. Come inserire valori double e float in sqlite?
- 25. inserire nei valori con clausola where
- 26. Come inserire i valori nella colonna dell'identità automatica in MYSQL
- 27. Jquery - inserire etichetta interna
- 28. Come inserire valori() nella classe cache di Guava?
- 29. Script di Bash per inserire valori in MySQL
- 30. Come limitare EditText per inserire solo valori float in Java?
Non aggiunge nuovi oggetti. Aggiunge un singolo, che viene utilizzato come indicatore della presenza di un valore nel set. Leggi il codice sorgente. –
In Java 8, hanno cambiato in oggetto statico finale privato PRESENT = new Object(); , che è il valore. – Sandeep
non ci sono risultati in termini di prestazioni perché l'oggetto è statico finale quindi è solo una costante e funzionerà come valore fittizio – Prashant