Io uso abitualmente lo HashMap
nei miei programmi, poiché so che di solito è il più efficiente (se usato correttamente) e può gestire facilmente mappe di grandi dimensioni. So di EnumMap
che è molto utile per le chiavi di enumerazione, ma spesso sto generando una piccola mappa che non diventerà mai molto grande, è probabile che venga scartata molto presto e non ha problemi di concorrenza.Quale implementazione della mappa <K,V> dovrei usare se la mia mappa deve essere più piccola che veloce?
È HashMap<K,V>
troppo complicato per questi piccoli usi locali e temporanei? C'è un'altra implementazione semplice che posso usare in questi casi?
Penso che sto cercando un'implementazione Map
che è analoga a ArrayList
per List
. Esiste?
aggiunta più tardi, dopo le risposte:
Qui è uno scenario in cui un lento ma molto semplice implementazione potrebbe essere meglio - quando ho molti, molti di questi Map
s. Supponiamo, per esempio, che io abbia un milione o più di queste piccole mappe minuscole, ciascuna con una manciata (spesso meno di tre) di voci. Ho un basso tasso di riferimento, forse non li faccio effettivamente riferimento prima che vengano scartati la maggior parte del tempo. È ancora il caso che HashMap
è la scelta migliore per loro?
L'utilizzo delle risorse è più della semplice velocità: mi piacerebbe qualcosa che non frammentasse molto l'heap e facesse sì che i GC impiegassero molto tempo, ad esempio.
È possibile che HashMap
sia la risposta corretta, ma questo non è un caso di ottimizzazione prematura (o almeno potrebbe non esserlo).
aggiunto molto più tardi, dopo qualche pensiero:
ho deciso di mano il codice mia SmallMap
. È facile crearne uno con AbstractMap
. Ho anche aggiunto un paio di costruttori in modo che un SmallMap
possa essere costruito da uno esistente Map
.
Lungo la strada ho dovuto decidere come rappresentare Entry
se implementare SmallSet
per il metodo entrySet
.
Ho imparato molto dalla codifica (e dall'unità di test questo) e voglio condividere questo, nel caso che qualcun altro ne voglia uno. È su github here.
Basta usare 'HashMap' e impostare una capacità iniziale appropriata, non si può fare meglio di così (a meno che non si possa usare' EnumMap', ovviamente). – Viruzzo
La ragione per cui non esiste un BigSlowMap e una FastSmallMap è che l'implementazione di base è abbastanza adattabile. – Viruzzo
Vedere anche le risposte a [questo] (http://stackoverflow.com/questions/633299/un-uno-consapevole-di-una-java-util-map-implementation-optimized-for-low-memory-use). –