2010-07-25 30 views

Respuesta

69

Puede probar System.arraycopy o hacer uso de funciones de matriz en la clase Arrays como java.util.Arrays.copyOf. Ambos deberían darle rendimiento nativo bajo el capó.

Arrays.copyOf es probablemente favorable para la legibilidad, pero solo se introdujo en java 1.6.

byte[] src = {1, 2, 3, 4}; 
byte[] dst = Arrays.copyOf(src, src.length); 
System.out.println(Arrays.toString(dst)); 
+0

Creo que la segunda opción es más "lógica". Nunca entendí por qué System.arraycopy() es donde está, una de las ubicaciones más torpes posibles. – sinuhepop

+0

@Sinuhe - está ahí por razones históricas. –

+12

Esta NO es la respuesta correcta. memcpy() no asigna datos, solo copias a un búfer existente. Mientras que Arrays.copyOf() asigna claramente nueva memoria. – splinux

5

Puede utilizar System.arrayCopy. Copia elementos de una matriz de origen a una matriz de destino. La implementación de Sun usa un ensamblador optimizado a mano, por lo que es rápido.

78

Uso System.arraycopy()

System.arraycopy(sourceArray, 
       sourceStartIndex, 
       targetArray, 
       targetStartIndex, 
       length); 

ejemplo,

String[] source = { "alpha", "beta", "gamma" }; 
String[] target = new String[source.length]; 
System.arraycopy(source, 0, target, 0, source.length); 


o bien utiliza Arrays.copyOf()
ejemplo,

target = Arrays.copyOf(source, length); 

java.util.Arrays.copyOf(byte[] source, int length) se agregó en JDK 1.6.

El método copyOf() usa System.arrayCopy() para hacer una copia de la matriz, pero es más flexible que clone() ya que puede hacer copias de partes de una matriz.

+0

+1 para los ejemplos. –

+0

Arrays.copyOf() también asigna memoria. en su ejemplo si cambia String [] target = new String [4]; y luego target = Arrays.copyOf() crea un nuevo objetivo que es un String [3]. No es el comportamiento memcopy. – MikeF

7

Si solo quiere una copia exacta de una matriz unidimensional, use clone().

byte[] array = { 0x0A, 0x01 }; 
byte[] copy = array.clone(); 

Para otras operaciones array de copia, utilice System.arrayCopy/Arrays.copyOf como Tom suggests.

En general, se debe evitar clone, pero esta es una excepción a la regla.

+0

Consulte también más detalles en la respuesta aceptada a http://stackoverflow.com/questions/3208899/how-do-i-clone-a-java-byte-array. –

2

Java realmente tiene algo como memcpy(). La clase insegura tiene un método copyMemory() que es esencialmente idéntico a memcpy(). Por supuesto, al igual que memcpy(), no proporciona protección contra superposiciones de memoria, destrucción de datos, etc. No está claro si realmente es un memcpy() o un memmove(). Se puede usar para copiar de direcciones reales a direcciones reales o de referencias a referencias. Tenga en cuenta que si se utilizan referencias, debe proporcionar un desplazamiento (o la JVM morirá lo antes posible).

Unsafe.copyMemory() funciona (hasta 2 GB por segundo en mi vieja PC). Úselo bajo su propio riesgo. Tenga en cuenta que la clase insegura no existe para todas las implementaciones de JVM.

+0

disculpa por ir a todas las mascotas en este hilo antiguo, pero ¿podría darme un ejemplo sobre cómo hacerlo con una serie de referencias. ¿Y es más rápido para pequeñas cantidades de datos (como de 1 a 4 MB) o simplemente vale la pena en el caso de datos más grandes como los 2 GB que mencionaste? – FinnTheHuman

+0

El uso de la clase 'sun.misc.Unsafe' se considera una mala práctica" piratear "b/c es una clase de paquete * privado *. Además, a partir de Java 9, ya no estará disponible, por lo que tratar de usar esta clase es lo mismo que pedirle a tu código que se rompa inesperadamente. – ray

Cuestiones relacionadas