Sebbene le risposte che propongono di utilizzare ArrayList abbiano senso nella maggior parte degli scenari, la vera domanda relativa alle prestazioni relative non è stata realmente risolta.
Ci sono alcune cose che puoi fare con un array:
- Crealo
- impostare un oggetto
- ottenere un oggetto
- clonalo / copialo
Conclusione generale
Sebbene le operazioni di get e set siano leggermente più lente su un ArrayList (rispettivamente 1 e 3 nanosecondi per chiamata sul mio computer), l' uso di un ArrayList rispetto a un array ha un carico di lavoro molto ridotto per qualsiasi uso non intensivo. Vi sono tuttavia alcune cose da tenere a mente:
- le operazioni di ridimensionamento su un elenco (quando si chiama
list.add(...)
) sono costose e si dovrebbe cercare di impostare la capacità iniziale a un livello adeguato quando possibile (si noti che lo stesso problema si presenta quando si utilizza un array)
- quando si ha a che fare con le primitive, le matrici possono essere significativamente più veloci poiché consentiranno di evitare molte conversioni di boxe / unboxing
- un'applicazione che ottiene / imposta valori solo in un ArrayList (non molto comune!) potrebbe vedere un aumento delle prestazioni di oltre il 25% passando a un array
Risultati dettagliati
Ecco i risultati che ho misurato per queste tre operazioni usando la libreria di benchmarking jmh (tempi in nanosecondi) con JDK 7 su una macchina desktop x86 standard. Si noti che ArrayList non viene mai ridimensionato nei test per assicurarsi che i risultati siano comparabili. Codice di riferimento disponibile qui .
Creazione di array / array
Ho eseguito 4 test, eseguendo le seguenti dichiarazioni:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
Risultati (in nanosecondi per chiamata, confidenza al 95%):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Conclusione: nessuna differenza evidente .
ottenere operazioni
Ho eseguito 2 test, eseguendo le seguenti dichiarazioni:
- getList:
return list.get(0);
- GetArray:
return array[0];
Risultati (in nanosecondi per chiamata, confidenza al 95%):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Conclusione: ottenere da un array è circa il 25% più veloce rispetto a ottenere da un ArrayList, sebbene la differenza sia solo dell'ordine di un nanosecondo.
impostare le operazioni
Ho eseguito 2 test, eseguendo le seguenti dichiarazioni:
- scaletta:
list.set(0, value);
- setArray:
array[0] = value;
Risultati (in nanosecondi per chiamata):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Conclusione: le operazioni impostate sugli array sono circa il 40% più veloci rispetto agli elenchi, ma, per quanto riguarda get, ogni operazione impostata richiede alcuni nanosecondi, quindi per far sì che la differenza raggiunga 1 secondo, è necessario impostare gli elementi nell'elenco / array centinaia di milioni di volte!
clone / copia
Delegati copia costruttore di ArrayList per Arrays.copyOf
così prestazioni è identica alla copia array (copia di un array tramite clone
, Arrays.copyOf
o System.arrayCopy
fa alcuna differenza sostanziale riguarda le prestazioni ).