Domanda

Qualcuno ha una buona regola per la scelta tra le diverse implementazioni di Java interfacce insieme come Elenco, Mappa, o Impostare?

Per esempio, in genere perché o in che casi, io preferisco usare un Vettore o di un ArrayList, una Tabella o una HashMap?

È stato utile?

Soluzione

Ho sempre fatto le decisioni su una base caso per caso, a seconda del caso d'uso, come ad esempio:

  • Ho bisogno di un ordine di rimanere?
  • Devo null chiavi/valori?Dups?
  • Sarà accessibile da più thread
  • Ho bisogno di una coppia chiave/valore
  • Ho bisogno di accesso casuale?

E poi rompere il mio handy 5 ° edizione Java in un guscio di noce e confrontare i ~20 o più opzioni.Ha bel po ' di tabelle nel Capitolo cinque, di aiutarci a capire ciò che è appropriato.

Ok, magari se mi conosce fuori il bracciale che un semplice ArrayList o HashSet farà il trucco non mi aspetto tutto.;) ma se c'è qualcosa di anche lontanamente complesso il mio indended uso, scommetto che sono nel libro.BTW, io però Vettoriale è supposto per essere "vecchio cappello'--io non l'ho usata anni.

Altri suggerimenti

Mi piace molto questo trucco foglio da Sergiy Kovalchuk s blog:

Java Map/Collection Cheat Sheet

Più dettagliata è stata quella di Alexander Zagniotov del diagramma di flusso, ma purtroppo non è in linea.

Assumo che tu sappia la differenza tra un Elenco, Impostare e Mappa delle risposte di cui sopra.Perché si dovrebbe scegliere tra loro implementazione delle classi è un'altra cosa.Per esempio:

Elenco:

  1. ArrayList è veloce nel recupero, ma lenta in inserimento.Va bene per un'implementazione che legge molto ma non inserire/rimuovere un sacco.Mantiene i suoi dati in un unico blocco continuo di memoria, in modo che ogni volta che ha bisogno di espandersi, si copia l'intera matrice.
  2. LinkedList è lento nel recupero, ma un rapido inserimento.Va bene per un'implementazione che inserisce/rimuove un sacco, ma non leggere un sacco.Non tenere l'intero array in un continuo blocco di memoria.

Set:

  1. HashSet non garantisce l'ordine di iterazione, e quindi è più veloce dell'imposta.È alto ed è più lento di ArrayList, pertanto, non uso tranne che per una grande quantità di dati quando il suo hash la velocità diventa un fattore.
  2. TreeSet mantiene i dati ordinati, quindi è più lento di HashSet.

Mappa: Le prestazioni e il comportamento di HashMap e diagramma ad albero sono in parallelo alla serie di implementazioni.

Vettoriali e Hashtable non deve essere utilizzato.Essi sono sincronizzati implementazioni, prima del rilascio della nuova Collezione gerarchia, così lento.Se la sincronizzazione è necessario, l'utilizzo di Insiemi.synchronizedCollection().

Teoricamente ci sono utili Big-Oh compromessi, ma in pratica questi quasi non importa.

Nel mondo reale i parametri di riferimento, ArrayList con prestazioni LinkedList anche con grandi liste di e con operazioni come "un sacco di inserzioni di fronte." Accademici ignorare il fatto che gli algoritmi sono fattori costanti che possono sopraffare la curva asintotica.Per esempio, collegati a liste di richiedere un ulteriore oggetto di assegnazione per ogni nodo, il che significa più lento per creare un nodo e molto peggio di accesso alla memoria le caratteristiche.

La mia regola è:

  1. Iniziare sempre con ArrayList e HashSet e HashMap (es.non LinkedList o diagramma ad albero).
  2. Tipo di dichiarazioni devono essere sempre un'interfaccia (es.Elenco, Insieme, la Mappa), quindi se un profiler o la revisione del codice dimostri il contrario è possibile modificare l'implementazione senza rompere nulla.

Riguardo la tua prima domanda...

Elenco, Mappa e Impostare servono a scopi diversi.Vi suggerisco di leggere su Java Collections Framework http://java.sun.com/docs/books/tutorial/collections/interfaces/index.html.

Per essere un po ' più concreto:

  • utilizza la Lista se avete bisogno di una matrice di dati di struttura ed è necessario iterare sugli elementi
  • utilizza la Mappa se avete bisogno di qualcosa come un dizionario
  • utilizzare un Set se avete solo bisogno di decidere se qualcosa appartiene all'insieme o no.

Sulla tua seconda domanda...

La differenza principale tra il Vettore e ArrayList è che il primo è sincronizzato, quest'ultimo non è sincronizzato.Si può leggere di più circa la sincronizzazione Java Concurrency in Pratica.

La differenza tra Hashtable (nota che la T non è una lettera maiuscola) e HashMap è simile, il primo è sincronizzato, quest'ultimo non è sincronizzato.

Direi che non ci sono nessuna regola di pollice per preferire una implementazione o in un altro, è davvero dipende dalle tue esigenze.

Per non ordinate la scelta migliore, più di nove volte su dieci, saranno:ArrayList, HashMap, HashSet.

Vettoriali e Hashtable sono sincronizzati e quindi potrebbe essere un po ' più lento.È raro che si desidera sincronizzare implementazioni, e quando si fanno le loro interfacce non sono sufficientemente ricchi per la loro sincronizzazione per essere utile.Nel caso della Mappa, ConcurrentMap aggiunge ulteriori operazioni per rendere l'interfaccia più utile.ConcurrentHashMap è una buona implementazione di ConcurrentMap.

LinkedList è quasi mai una buona idea.Anche se si sta facendo un sacco di inserimenti e di rimozione, se si utilizza un indice per indicare la posizione, quindi, che richiede scorrere l'elenco per trovare il nodo corretto.ArrayList è quasi sempre più veloce.

Per la Mappa e Impostare l'hash varianti più veloce rispetto albero/ordinati.Hash algortihms tendono ad avere O(1) le prestazioni, mentre gli alberi O(log n).

Liste permettono di elementi duplicati, mentre consente una sola istanza.

Io uso una Mappa ogni volta che ho bisogno di eseguire una ricerca.

Per le implementazioni specifiche, ci sono un ordine di conservazione variazioni di Mappe e Imposta, ma in gran parte si tratta di velocità.Io tendo ad usare ArrayList per ragionevolmente piccole Liste e HashSet per le dimensioni ridotte della serie, ma ci sono molte implementazioni (incluse quelle che scrivete voi stessi).HashMap è abbastanza comune per le Mappe.Qualcosa di più di 'pulizia' e si deve iniziare a preoccuparsi di memoria in modo che sarà il modo più specifico in modo algoritmico.

Questa pagina ha un sacco di immagini animate con codice di esempio di test LinkedList vsArrayList se siete interessati a numeri duri.

EDIT: Spero che il seguente link dimostrare come queste cose sono veramente pochi gli elementi in una casella degli strumenti, basta pensare a ciò che le vostre esigenze sono:Vedi Commons-Collezioni versioni di Mappa, Elenco e Set.

Come suggerito in altre risposte, ci sono diversi scenari di utilizzo corretta raccolta differenziata, a seconda dell'uso caso.Sto elencare alcuni punti,

ArrayList:

  • La maggior parte dei casi in cui è sufficiente per memorizzare o iterare un "sacco di cose" e poi scorrere attraverso di loro.L'iterazione è più veloce di quanto il suo indice di base.
  • Ogni volta che si crea un ArrayList di un importo fisso di memoria è allocata e una volta exceeeded,copia l'intero array

LinkedList:

  • Utilizza la lista doppiamente linkata in modo di inserimento e cancellazione operazione sarà veloce come sarà solo aggiungere o rimuovere un nodo.
  • Il recupero è lento come dovrà scorrere i nodi.

HashSet:

  • Fare altri sì-no le decisioni su un elemento, ad es."è la voce di una parola di inglese", "è l'elemento nel database?" "è l'elemento in questa categoria?" etc.

  • Ricordando "che gli elementi che hai già trattati", ad es.quando si fa una scansione web;

HashMap:

  • Utilizzato nei casi in cui è necessario dire "per un dato X, qual è la Y"?Spesso è utile per l'implementazione di cache in memoria o indici i.e coppie chiave-valore, Ad esempio:Per un dato utente ID, qual è il loro nome memorizzato nella cache/oggetto Utente?.
  • Sempre andare con HashMap per eseguire una ricerca.

Vettoriali e Hashtable sono sincronizzati e quindi più lento, e Se la sincronizzazione è necessario, l'utilizzo di Insiemi.synchronizedCollection().Controllare Questo per insiemi ordinati.Spero che questo hepled.

Ho trovato Bruce Eckel di Thinking in Java per essere molto utile.Egli paragona le diverse collezioni molto bene.Ho usato per tenere un diagramma ha pubblicato che mostra l'eredità heirachy sul mio cubo da parete come riferimento rapido.Una cosa che ti suggerisco di fare è tenere a mente la sicurezza dei thread.Prestazioni di solito significa non thread-safe.

Beh, dipende da cosa hai bisogno.Le linee guida generali sono:

Elenco è una collezione in cui i dati sono conservati in ordine di inserimento e di ogni elemento ha indice.

Set è un sacco di elementi duplicati (se si reinserire lo stesso elemento, non sarà aggiunto).I dati non hanno la nozione di ordine.

Mappa Accedi e scrivi i tuoi dati elementi chiave, che potrebbe essere un qualsiasi oggetto.

enter image description here Attribuzione: https://stackoverflow.com/a/21974362/2811258

Per ulteriori informazioni su Java, Collezioni, check out questo articolo.

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