Ho un byte [] e vorrei copiarlo in un altro byte []. Forse sto mostrando il mio semplice sfondo 'C' qui, ma c'è un equivalente a memcpy() su array di byte in Java?Esiste un equivalente a memcpy() in Java?
risposta
Si potrebbe provare System.arraycopy
o utilizzare le funzioni di matrice nella classe Arrays
come java.util.Arrays.copyOf
. Entrambi dovrebbero darti prestazioni natali sotto il cofano.
Arrays.copyOf è probabilmente favorevole per la leggibilità, ma è stato introdotto solo in java 1.6.
byte[] src = {1, 2, 3, 4};
byte[] dst = Arrays.copyOf(src, src.length);
System.out.println(Arrays.toString(dst));
È possibile utilizzare System.arraycopy
È possibile utilizzare System.arrayCopy. Copia elementi da una matrice sorgente a una matrice di destinazione. L'implementazione di Sun utilizza un assemblatore ottimizzato a mano, quindi è veloce.
System.arraycopy(sourceArray,
sourceStartIndex,
targetArray,
targetStartIndex,
length);
Esempio,
String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);
oppure usa Arrays.copyOf()
Esempio,
target = Arrays.copyOf(source, length);
java.util.Arrays.copyOf(byte[] source, int length)
è stato aggiunto in JDK 1.6.
Il metodo copyOf()
utilizza System.arrayCopy()
per creare una copia dell'array, ma è più flessibile di clone()
poiché è possibile eseguire copie di parti di un array.
+1 per gli esempi. –
Arrays.copyOf() assegna anche memoria. nel tuo esempio se cambi String [] target = new String [4]; e quindi target = Arrays.copyOf() crea un nuovo target che è una stringa [3]. Non il comportamento memcopy. – MikeF
Se si desidera solo una copia esatta di un array monodimensionale, utilizzare clone()
.
byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();
Per altre operazioni di copia matrice, utilizzare System.arrayCopy
/Arrays.copyOf
come Tom suggests.
In generale, è consigliabile evitare clone
, ma questa è un'eccezione alla regola.
Vedi anche maggiori dettagli nella risposta accettata a http://stackoverflow.com/questions/3208899/how-do-i-clone-a-java-byte-array. –
Java ha effettivamente qualcosa come memcpy(). La classe Unsafe ha un metodo copyMemory() che è essenzialmente identico a memcpy(). Ovviamente, come memcpy(), non fornisce alcuna protezione dalle sovrapposizioni di memoria, dalla distruzione dei dati, ecc. Non è chiaro se sia realmente un memcpy() o un memmove(). Può essere utilizzato per copiare da indirizzi reali a indirizzi reali o da riferimenti a riferimenti. Si noti che se vengono utilizzati riferimenti, è necessario fornire un offset (o la JVM morirà APPENA POSSIBILE).
Unsafe.copyMemory() funziona (fino a 2 GB al secondo sul mio vecchio PC stanco). Utilizzare a proprio rischio. Si noti che la classe Unsafe non esiste per tutte le implementazioni JVM.
scusa per aver fatto il seminario su questo thread antico, ma potresti darmi un esempio su come farlo con una serie di riferimenti. Ed è più veloce per piccole quantità di dati (come 1-4 MB) o semplicemente degno in caso di dati più grandi come il 2GB che hai citato? – FinnTheHuman
L'uso della classe 'sun.misc.Unsafe' è considerata una cattiva pratica" hack "b/c è una classe di pacchetto * private *. Inoltre, a partire da Java 9, non sarà più disponibile, quindi provare a utilizzare questa classe equivale a chiedere l'interruzione imprevista del codice. – ray
- 1. Esiste un equivalente a memcpy() che funziona all'interno di un kernel CUDA?
- 2. Esiste epoll equivalente in Java?
- 3. Esiste un equivalente a SuppressWarnings in Scala?
- 4. Esiste un equivalente a "continua" in Parallel.ForEach?
- 5. Esiste un valore .Net equivalente a java.util.concurrent.Executor?
- 6. Esiste un C++ equivalente a BigDecimal di Java?
- 7. Esiste un equivalente Java di SignalR?
- 8. equivalente a memcmp() in Java?
- 9. Java equivalente a WPF
- 10. Esiste .Net TypeConverter equivalente in Java
- 11. Esiste un equivalente di getch() da C++ in Java?
- 12. Esiste un WPF equivalente a System.Windows.Forms.Screen?
- 13. Esiste un vim equivalente a '! $' Di bash?
- 14. In Java esiste un equivalente della classe Convert da C#?
- 15. Esiste un tag XML equivalente a `ListView.addHeaderView '?
- 16. Esiste un equivalente a `cabal-dev ghc`
- 17. Esiste un Python equivalente a HighLine?
- 18. Esiste un S4 equivalente a unlist()?
- 19. Esiste un css equivalente a "align =" center ""?
- 20. Esiste un equivalente C# a IsDebuggerPresent()?
- 21. Esiste un PHP equivalente a Compass?
- 22. Esiste un dplyr equivalente a data.table :: rleid?
- 23. Esiste un OO Perl equivalente a un'interfaccia?
- 24. Esiste un equivalente di C# indexer in Java?
- 25. Esiste un equivalente del metodo Java equals in C++?
- 26. Esiste un equivalente di Groovy in C#?
- 27. . Equivalente a Java AssertionError Java
- 28. Funzione equivalente a C "_getch()" in Java?
- 29. Java equivalente a .Net NotSupportedException
- 30. Esiste una versione standard, striata di memcpy?
Penso che la seconda opzione sia più "logica". Non ho mai capito perché System.arraycopy() è dove si trova, una delle posizioni più clamorose possibili. – sinuhepop
@Sinuhe: è lì per ragioni storiche. –
Questa NON è la risposta corretta. memcpy() non assegna dati, ma solo copie a un buffer esistente. Mentre Arrays.copyOf() alloca chiaramente nuova memoria. – splinux