2009-09-02 16 views
8

Qual è il modo preferito per copiare un array di un tipo non primitve in Java? Che ne dici dei problemi di rendimento?Java: copia array di tipo non primitivo

+0

Si desidera solo copiare l'array stesso (ovvero i riferimenti nell'array) oppure si desidera clonare tutti gli oggetti a cui puntano i riferimenti nell'array? – Jesper

risposta

7

La via vecchia scuola era:

public static void java.lang.System.arraycopy(Object src, int srcPos, 
     Object dest, int destPos, int length) 

Questo copys da uno esistente array ad un altro. Devi allocare il nuovo array tu stesso ... presumendo che tu stia facendo una copia di un array.

A partire da JDK 6, la classe java.util.Arrays ha un numero di metodi copyOf per creare copie di array, con una nuova dimensione. Quelli che sono rilevanti sono:

public static <T> T[] copyOf(T[] original, int newLength) 

e

public static <T,U> T[] copyOf(U[] original, int newLength, 
     Class<? extends T[]> newType) 

Questo primo esegue una copia utilizzando il tipo di matrice originale, e la seconda esegue una copia con un diverso tipo di matrice.

Si noti che sia arraycopy che l'argomento 3 copyOf devono controllare i tipi di ciascuno degli elementi nell'array originale (origine) rispetto al tipo di matrice di destinazione. Quindi entrambi possono lanciare eccezioni di tipo. Il 2 argomento copyOf (almeno in teoria) non ha bisogno di fare alcun tipo di controllo e quindi dovrebbe essere (in teoria) più veloce. In pratica, le prestazioni relative dipenderanno dall'attuazione. Ad esempio, la JVM riceve spesso un trattamento speciale da arraycopy.

+0

Per chi si chiedeva 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'non verrà compilato (_" Il metodo copyOf (int [], int) nel tipo Array non è applicabile per gli argomenti (int [], int, classe ) "_) –

14
System.arraycopy 

(che dà la possibilità di copiare porzioni arbitrarie di un array tramite i parametri offset e length). O

java.util.Arrays.copyOf 

che è stata aggiunta in JDK 6 ed è un metodo generico in modo che possa essere utilizzato:

Integer[] is = new Integer[] { 4, 6 } 
Integer[] copy = Arrays.copyOf(is, is.length); 

Oppure può restringere un tipo:

Number[] is = new Number[]{4, 5}; 
Integer[] copy = Arrays.copyOf(is, is.length, Integer[].class); 

noti che è possibile utilizzare anche il metodo clone su un array:

Number[] other = is.clone(); 
+0

Touché oxbow - qualcuno è arrivato mezz'ora dopo con la stessa risposta ed è stato accettato! – pjp

+0

@pjp: ho accettato la risposta di Stephen mentre si rivolgeva anche alla parte relativa alle prestazioni della domanda. – desolat

+0

Non c'è nessun problema * desolat * - non sono sicuro del perché * pjp * sia così permaloso! –

Problemi correlati