Utilizzando Piccoli (da 1 a 10 Elementi) a Livello di Istanza Collezioni in Java
-
09-06-2019 - |
Domanda
Mentre la creazione di classi in Java mi trovo spesso a creare a livello di istanza collezioni che io sappia in anticipo di tempo sarà molto piccola - il meno di 10 elementi della collezione.Ma non so il numero di elementi in anticipo in modo che io di solito optare per un insieme dinamico (ArrayList, Vettoriali, ecc).
class Foo
{
ArrayList<Bar> bars = new ArrayList<Bar>(10);
}
Una parte di me continua fastidioso a me che è uno spreco usare complessi insiemi dinamici per qualcosa di così piccole dimensioni.C'è un modo migliore di implementare qualcosa di simile a questo?O è la norma?
Nota, io non sono colpita (evidente) prestazioni di sanzioni o qualcosa di simile.Questo è solo mi chiedo se non c'è un modo migliore di fare le cose.
Soluzione
Il ArrayList
classe in Java ha solo due membri di dati, un riferimento a un Object[]
matrice e una dimensione che è necessario in ogni caso, se non si utilizza un ArrayList
.Quindi l'unico vantaggio di non uso di un ArrayList
è il salvataggio di un oggetto di assegnazione, che è improbabile per essere un grande affare.
Se si sta creando e smaltimento di molte, molte istanze della classe contenitore (e, per estensione, il ArrayList
esempio) ogni secondo, si potrebbe hanno un piccolo problema con la procedura di garbage collection churn—ma che è qualcosa di cui preoccuparsi se si verifica mai.Garbage collection è in genere l'ultima delle tue preoccupazioni.
Altri suggerimenti
Per il bene di mantenere le cose semplici, credo che questo è praticamente un non-problema.L'implementazione è abbastanza flessibile che se i requisiti di cambiare in futuro, non si è costretti in un refactoring.Inoltre, l'aggiunta più logica per il codice per una soluzione ibrida, semplicemente non vale la pena di prendere in considerazione il vostro piccolo insieme di dati e di alta qualità di Java API per la Raccolta.
Google Collezioni ha collezioni ottimizzato per immutabile/piccolo numero di elementi.Vedere Lists.asList
API come un esempio.
L'overhead è molto piccolo.È possibile scrivere un ibrido elenco di matrice che contiene i campi per i primi elementi, e poi torna a utilizzare un array per elenco più lungo.
È possibile evitare il sovraccarico dell'elenco oggetto interamente utilizzando una matrice.Per andare ancora di più hardcore, si può dichiarare un campo come Oggetto, e di evitare la matrice del tutto per un singolo elemento.
Se la memoria è davvero un problema, si potrebbe desiderare di dimenticare utilizzando istanze di oggetti a basso livello.Invece di usare una grande struttura di dati in un grande livello di granularità.