Tengo un byte [] y me gustaría copiarlo en otro byte []. Tal vez estoy mostrando mi fondo simple 'C' aquí, pero ¿hay un equivalente a memcpy() en matrices de bytes en Java?¿Hay un equivalente a memcpy() en Java?
Respuesta
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));
Puede utilizar System.arraycopy
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.
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.
+1 para los ejemplos. –
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
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.
Consulte también más detalles en la respuesta aceptada a http://stackoverflow.com/questions/3208899/how-do-i-clone-a-java-byte-array. –
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.
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
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
- 1. ¿Hay un Java equivalente a libevent?
- 2. ¿Hay un Java equivalente a MISRA C?
- 3. ¿Hay un equivalente a memcpy() que funcione dentro de un kernel CUDA?
- 4. ¿Hay un equivalente de ucwords en java
- 5. ¿Hay equivalente epoll en Java?
- 6. ¿Hay un equivalente a Groovy en C#?
- 7. ¿Hay un equivalente a java @SuppressWarnings en JSP
- 8. ¿Hay un C# equivalente a File.separator en Java
- 9. ¿Hay un equivalente a SuppressWarnings en Scala?
- 10. ¿Hay un C# equivalente a CountDownLatch de Java?
- 11. ¿Hay un equivalente Java de frexp?
- 12. ¿Hay un equivalente Java para LINQ?
- 13. ¿Hay un equivalente a typedef en C#?
- 14. ¿Hay un equivalente a DBus en OSX?
- 15. ¿Hay equivalente .NET TypeConverter en Java
- 16. ¿Hay un destructor de C++ equivalente en Java?
- 17. ¿Hay un equivalente de "Group Box" en Java Swing?
- 18. ¿Hay un equivalente en C# para este código de Java?
- 19. ¿Hay un equivalente del método de Java igual en C++?
- 20. ¿Hay un WPF equivalente a System.Windows.Forms.Screen?
- 21. ¿Hay un css equivalente a 'align = "center"'?
- 22. ¿Hay un C++ equivalente a getcwd?
- 23. ¿Hay un entero equivalente a __toString()
- 24. ¿Hay un equivalente a php.net para JavaScript?
- 25. ¿Hay un equivalente a HLint para Erlang?
- 26. ¿Hay un C# equivalente a IsDebuggerPresent()?
- 27. ¿Equivalente a #define en Java?
- 28. ¿Hay una versión estándar, strided de memcpy?
- 29. ¿Hay un equivalente a 'continuar' en un Parallel.ForEach?
- 30. ¿Hay un equivalente a la clase Bootstrap en un complemento
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
@Sinuhe - está ahí por razones históricas. –
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