Non ho nulla di sostanziale da aggiungere alla risposta di ruakh, ma ecco una rapida funzione di test. Mantengo un progetto di scarto in giro per scrivere piccoli test come questi. Regola SourceSize su qualcosa di rappresentativo dei tuoi dati e puoi farti un'idea approssimativa dell'entità dell'effetto. Come mostrato, ho visto un fattore di 2 tra di loro.
import java.util.ArrayList;
import java.util.Random;
public class ALTest {
public static long fill(ArrayList<Byte> al, byte[] source) {
long start = System.currentTimeMillis();
for (byte b : source) {
al.add(b);
}
return System.currentTimeMillis()-start;
}
public static void main(String[] args) {
int sourceSize = 1<<20; // 1 MB
int smallIter = 50;
int bigIter = 4;
Random r = new Random();
byte[] source = new byte[sourceSize];
for (int i = 0;i<bigIter;i++) {
r.nextBytes(source);
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>(sourceSize);
time += fill(al,source);
}
System.out.print("With: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>();
time += fill(al,source);
}
System.out.print("Without: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>();
time += fill(al,source);
}
System.out.print("Without: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>(sourceSize);
time += fill(al,source);
}
System.out.print("With: "+time+"ms");
}
System.out.println();
}
}
}
uscita:
With: 401ms Without: 799ms Without: 731ms With: 347ms
With: 358ms Without: 744ms Without: 749ms With: 342ms
With: 348ms Without: 719ms Without: 739ms With: 347ms
With: 339ms Without: 734ms Without: 774ms With: 358ms
Quando viene raggiunta la capacità della ArrayList, CLR crea un nuovo ArrayList con il doppio della capacità di quello originale e copia tutti gli elementi da quella originale per la nuova costituzione uno. Quindi puoi salvare questo lavoro extra preimpostando la dimensione di ArrayList se hai qualche idea relativa alle dimensioni richieste. –
@Deepansh: non è una domanda Java? In che modo CLR è entrata in scena? Immagino tu intenda JVM? Inoltre, la tua descrizione sembra corretta ma "in CLR" (.Net), ci vuole più tempo quando prelezzo le dimensioni. Almeno, questo è quello che succede quando l'ho testato su 1000000 articoli. L'ho testato per 10-15 volte e ogni volta il costruttore ArrayList predefinito ha vinto! – TCM
Ho detto ArrayList, ma può applicarsi al concetto in generale di avere una vista elenco di una raccolta che è internamente supportata da una matrice. – Maverick