Tengo un byte [] y me gustaría copiarlo en otro byte []. Tal vez esté mostrando mi fondo simple 'C' aquí, pero ¿existe un equivalente a memcpy () en matrices de bytes en Java?
81
Puede probar System.arraycopy
o hacer uso de funciones de matriz en la Arrays
clase como java.util.Arrays.copyOf
. Ambos deberían brindarte un 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));
Utilice System.arraycopy ()
Ejemplo,
String[] source = { "alpha", "beta", "gamma" }; String[] target = new String[source.length]; System.arraycopy(source, 0, target, 0, source.length);
o use Arrays.copyOf ()
Example,
java.util.Arrays.copyOf(byte[] source, int length)
se agregó en JDK 1.6.El
copyOf()
método se usaSystem.arrayCopy()
para hacer una copia de la matriz, pero es más flexibleclone()
ya que puede hacer copias de partes de una matriz.fuente
Si solo desea una copia exacta de una matriz unidimensional, use
clone()
.byte[] array = { 0x0A, 0x01 }; byte[] copy = array.clone();
Para otras operaciones de copia de matriz, use
System.arrayCopy
/Arrays.copyOf
como sugiere Tom .En general,
clone
debe evitarse, pero esto es una excepción a la regla.fuente
Puede utilizar System.arrayCopy . Copia elementos de una matriz de origen a una matriz de destino. La implementación de Sun utiliza un ensamblador optimizado a mano, por lo que es rápido.
fuente
Java en realidad tiene algo como memcpy (). La clase Unsafe tiene un método copyMemory () que es esencialmente idéntico a memcpy (). Por supuesto, como 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 utilizar 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 cansada). Úselo bajo su propio riesgo. Tenga en cuenta que la clase Unsafe no existe para todas las implementaciones de JVM.
fuente
sun.misc.Unsafe
clase se considera una mala práctica "piratear" porque es una clase de paquete privado . Además, a partir de Java 9, ya no estará disponible, por lo que intentar usar esta clase es lo mismo que pedir que su código se rompa inesperadamente.Puede usar System.arraycopy
fuente
Utilizar byteBufferViewVarHandle o byteArrayViewVarHandle.
Esto le permitirá copiar una matriz de "largos" directamente a una matriz de "dobles" y similares con algo como:
public long[] toLongs(byte[] buf) { int end = buf.length >> 3; long[] newArray = new long[end]; for (int ii = 0; ii < end; ++ii) { newArray[ii] = (long)AS_LONGS_VH.get(buf, ALIGN_OFFSET + ii << 3); } } private static final ALIGN_OFFSET = ByteBuffer.wrap(new byte[0]).alignmentOffset(8); private static final VarHandle AS_LONGS_VH = MethodHandles.byteArrayViewVarHandle(long[].class, ByteOrder.nativeOrder());
Esto le permitirá hacer un poco de pirateo como:
float thefloat = 0.4; int floatBits; _Static_assert(sizeof theFloat == sizeof floatBits, "this bit twiddling hack requires floats to be equal in size to ints"); memcpy(&floatBits, &thefloat, sizeof floatBits);
fuente
No. Java no tiene equivalente a
memcpy
. Java tiene un equivalente a en sumemmove
lugar.Documentos de Oracle
Es muy probable
System.arraycopy
que nunca tenga el mismo rendimiento quememcpy
sisrc
y sedest
refiera a la misma matriz. Sin embargo, normalmente esto será lo suficientemente rápido.fuente