2010-06-18 6 views
10

DISCLAIMER:
Questa domanda non voleva essere polemica!Il modo più veloce ed efficiente di cercare una coppia chiave-valore in Java?

Qual è il modo più veloce e meno drenante della memoria per cercare una coppia chiave-valore? Conserverò gli oggetti in una relazione di valore-chiave e ho bisogno di accedervi rapidamente. Dovrei usare un database SQLite? Una cartina? Un Hashtable? Una HashMap? Si prega di fornire alcuni vantaggi/svantaggi dell'uso di qualsiasi metodo di ricerca.

risposta

11

Qualsiasi struttura basata su hash Map è la soluzione ottimale per il tempo in cui il codice hash function per la chiave è efficiente. È possibile utilizzare id valore: s come risultato della ricerca per risparmiare memoria durante la ricerca.

Se i dati sono già nel database, è possibile lasciare questa ricerca interamente al RDBMS, dopo tutto sono fatti per questa roba.

7

Se i tuoi dati sono in memoria, i numeri Map in generale sono i tuoi amici - sono pensati per questo.

Non utilizzare tuttavia Hashtable. È molto più lento delle più recenti implementazioni di mappe. perché i suoi metodi sono sincronizzati, il più delle volte non è necessario (e quando necessario, c'è un'alternativa molto migliore - vedi sotto).

Nel contesto a thread singolo, HashMap probabilmente andrà bene.

Se è necessaria la sicurezza del filo, utilizzare ConcurrentHashMap.

+0

HashTable NON è sincronizzato e più veloce di ConcurrentHashMap in ambienti a thread singolo mentre non ha alcun blocco! Se l'accesso alla mappa è multithreading ConcurrentHashMap è davvero la soluzione migliore. –

+0

@Tobias, "A differenza delle nuove implementazioni di raccolta, Hashtable è sincronizzato" - da http://java.sun.com/j2se/1.5.0/docs/api/java/util/Hashtable.html –

+1

Dato che stiamo parlando sulla semantica ... "L'implementazione di' ConcurrentHashMap' funziona meglio di 'HashMap' in quasi tutte le situazioni.Consente anche letture e scritture simultanee simultanee, e ha metodi che supportano operazioni composite comuni che altrimenti non sono thread-safe Se Java 5 è l'ambiente di distribuzione, inizia con 'ConcurrentHashMap'." * Clean Code - Un manuale di software agile Artigianato, Robert C. Martin, p.183 * – Esko