2013-11-04 11 views
7

Mi sono imbattuto in una domanda relativa a ArrayList di Java in un test scritto dell'azienda. La mia domanda è solo una piccola parte della domanda reale.Il modo più veloce per copiare un elenco di array su un altro

Diciamo che abbiamo la seguente funzione per copiare un ArrayList ad un altro:

void function(List<E> l) 
{ 
    List<E> m = new ArrayList<E>(l); 
} 

La domanda chiede sostanzialmente quella di ottimizzare questa operazione di copia. L'elenco può contenere un milione di voci. Ho provato i seguenti approcci:

Collections.copy

System.Arraycopy

addAll

Ma tutte queste sembrano essere più lento rispetto il metodo indicato. Ho bisogno di un metodo più veloce del metodo dato o è il metodo migliore disponibile?

+0

No, questo è totalmente il miglior metodo disponibile. –

+0

Collections.unmodifiableList (elenco) è più veloce, ma potrebbe non essere adatto all'intetto (che trovo estremamente mal definito nella domanda). – Durandal

risposta

3

Beh, in primo luogo penso che ci sia un errore di benchmark. public ArrayList(Collection<? extends E> c) utilizza Arrays.copyOf che utilizza internamente System.arraycopy (origine here). Quindi System.arraycopy o addAll non può essere più lento del codice indicato.

Per la domanda, non ci può essere un modo più veloce (dato che si desidera non perdere le informazioni sul tipo, che potrebbero salvare cicli di clock ma molto banali) in quanto l'operazione dovrà essere O(n). E System.arraycopy è la via più veloce, dato che usa le chiamate native per copiarle velocemente.

0

Se ti sporchi, Unsafe sarà leggermente più veloce. Tuttavia, è necessario avere accesso alla matrice Object sottostante di ArrayLists mediante reflection. Usalo solo se ti trovi in ​​una situazione di vita o di morte per quanto riguarda le prestazioni.

public native void copyMemory (java.lang.Object o, long l, java.lang.Object o1, long l1, long l2);

+0

Questo non dovrebbe essere più veloce di 'System.arraycopy()', poiché probabilmente chiama in codice nativo molto simile. –

+0

non necessario. La copia non sicura è intrinseca in HotSpot e non controlla i limiti. Tuttavia, la differenza sarà minima e rilevante solo se si copiano molti array di piccole dimensioni. Probabilmente non ne vale la pena, tuttavia si potrebbe dare un colpo alla versione non sicura. La VM non è così prevedibile :-) –

Problemi correlati