Implementazioni raccolte Java (ad es. HashMaps vs HashSet vs HashTable ...), qual è il costo della scelta di quella sbagliata? [chiuso]

StackOverflow https://stackoverflow.com/questions/1033482

Domanda

Nel mio codice, per impostazione predefinita, utilizzo ArrayList per tutte le liste, HashMap per tutte le mappe, HashSet per tutte le serie.

Da un punto di vista pratico quanto sto perdendo in flessibilità, scalabilità, leggibilità e prestazioni scegliendo l'implementazione sbagliata? Quando ha senso dedicare del tempo a decidere di utilizzarne uno anziché un altro?

Certamente vedo un caso molto chiaro sul perché qualcuno dovrebbe usare un LinkedList invece di un ArrayList in determinate circostanze. Quando qualcuno ritiene che sia fondamentale utilizzare una HashMap anziché una TreeMap o una HashTable? E i set?

Domande:

  1. Quanto costa scegliere male?
  2. Qualcuno ha storie di disastri sulla scelta dell'implementazione sbagliata e del data center che prende fuoco?
  3. Qualche buona regola empirica?
  4. Ci sono implementazioni di raccolte oscure senza le quali non puoi vivere?

Ho letto attentamente:

Ho trovato questa domanda da mettere in relazione dal punto di vista teorico, ma io ' Sono più interessato a un mondo reale, giù nella risposta alle trincee.

È stato utile?

Soluzione

Questa è una domanda molto generica, ma ti lancerò un paio di commenti.

Se stai programmando orientato alle interfacce, la flessibilità non avrà un grande successo. Ad esempio

void foo(List<E> list);

Il costo per scegliere male potrebbe essere visto nelle penalità di prestazione. Ad esempio, scegliere un LinkedList quando l'accesso diretto (come in ArrayList) è ciò che stai cercando.

I set hanno un problema simile. Se si desidera mantenere raccolte ordinate senza duplicati, un SortedSet sarebbe una scelta più saggia rispetto a un HashSet. In quest'ultimo caso, dovresti ordinare l'intero Set manualmente (questa è una chiamata a Collections.sort ())

< EDIT >

Come per maps , ci sono molte implementazioni diverse. Ognuno ha uno scopo diverso. Ad esempio, esiste SortedMap , analogico a SortedSet. Quindi, c'è WeakHashMap , che non funziona come una HashMap, nel senso che le chiavi possono essere rimosse dal Garbage Collector. Come puoi immaginare, la scelta tra una HashMap e una WeakHashMap non è banale. Come sempre, dipende da cosa vuoi implementare con loro.

< / EDIT >

Per quanto riguarda la storia, nel mio progetto attuale, abbiamo sostituito un HashSet con un SortedSet perché le prestazioni erano compromesse. Tuttavia, DataCenter non ha preso fuoco.

I miei due centesimi.

Altri suggerimenti

Finché segui la buona pratica OO di a seconda di un tipo astratto , che importa?

Se, ad esempio, scopri di aver usato la Mappa sbagliata, semplicemente cambi l'implementazione che stai utilizzando e poiché tutte le tue dipendenze sono su Mappa tutto funziona come prima solo con le diverse caratteristiche prestazionali.

Penso che tu possa usare HashMap, HashSet e ArrayList come implementazioni principali. Quando è necessario un set ordinato, è bene sapere che TreeSet è disponibile; quando fai cose ricorsive, allo stesso modo, è bello avere LinkedList nella tasca posteriore. Ma programma per interfacce e quindi puoi scambiare le implementazioni secondo necessità. E se la stessa raccolta deve essere elaborata come (ad esempio) sia una LinkedList che una ArrayList, non è un grosso problema costruire l'una dall'altra.

Lavora con le implementazioni predefinite che hai elencato. Quando ci sono problemi di prestazioni e c'è motivo di credere che un'implementazione alternativa sarebbe migliore, scambiarla e misurare la differenza. Quando hai bisogno di un comportamento speciale (set ordinati, per esempio), usa le classi speciali.

Questo approccio non mi ha ancora bruciato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top