2009-09-02 15 views
8

¿Cuál es la forma preferida de copiar una matriz de tipo no primitivo en Java? ¿Qué hay de los problemas de rendimiento?Java: copiar matriz de tipo no primitivo

+0

¿Desea copiar solo la matriz (es decir, las referencias en la matriz), o también desea clonar todos los objetos a los que apuntan las referencias en la matriz? – Jesper

Respuesta

7

La forma de la vieja escuela era:

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

Este copys de una matriz existente a otro. Debe asignar la nueva matriz usted mismo ... suponiendo que está haciendo una copia de una matriz.

A partir de JDK 6 en adelante, la clase java.util.Arrays tiene una serie de métodos copyOf para hacer copias de matrices, con un nuevo tamaño. Los que son relevantes son:

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

y

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

Esta primera uno hace una copia con el tipo de matriz original, y la segunda se hace una copia con un diferente tipo de matriz.

Tenga en cuenta que tanto arraycopy como los 3 argumentos copyOf tienen que verificar los tipos de cada uno de los elementos en la matriz original (fuente) con respecto al tipo de matriz de destino. Entonces ambos pueden arrojar excepciones de tipo. El argumento 2 de copyOf (al menos en teoría) no necesita hacer ninguna comprobación de tipo y, por lo tanto, debería ser (en teoría) más rápido. En la práctica, el rendimiento relativo dependerá de la implementación. Por ejemplo, el JVM a menudo da un tratamiento especial a arraycopy.

+0

Para quien se haya preguntado 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'no compila (_" El método copyOf (int [], int) en el tipo Arrays no es aplicable para los argumentos (int [], int, clase ) "_) –

14
System.arraycopy 

(que le da la capacidad de copiar porciones arbitrarias de una matriz a través de los parámetros offset y length). O

java.util.Arrays.copyOf 

que se añadió en JDK 6 y es un método genérico para que pueda ser utilizado:

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

o se puede reducir a un tipo:

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

en cuenta que puede también utilice el clone método en una matriz:

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

Toque oxbow - alguien llegó media hora más tarde con la misma respuesta y fue aceptado! – pjp

+0

@pjp: Acepté la respuesta de Stephen, ya que también abordó la parte del rendimiento de la pregunta. – desolat

+0

No es problema en absoluto * desolat * - no estoy seguro de por qué * pjp * es tan delicado! –

Cuestiones relacionadas