Ich habe ein Byte [] und möchte es in ein anderes Byte [] kopieren. Vielleicht zeige ich hier meinen einfachen 'C'-Hintergrund, aber gibt es ein Äquivalent zu memcpy () auf Byte-Arrays in Java?
Antworten:
Sie können versuchen System.arraycopy
, Array-Funktionen in der Arrays
Klasse wie zu verwenden java.util.Arrays.copyOf
. Beide sollten Ihnen native Leistung unter der Haube bieten.
Arrays.copyOf ist wahrscheinlich günstig für die Lesbarkeit, wurde jedoch nur in Java 1.6 eingeführt.
byte[] src = {1, 2, 3, 4};
byte[] dst = Arrays.copyOf(src, src.length);
System.out.println(Arrays.toString(dst));
Verwenden Sie System.arraycopy ()
System.arraycopy(sourceArray,
sourceStartIndex,
targetArray,
targetStartIndex,
length);
Beispiel,
String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);
oder verwenden Sie Arrays.copyOf ()
Beispiel,
target = Arrays.copyOf(source, length);
java.util.Arrays.copyOf(byte[] source, int length)
wurde in JDK 1.6 hinzugefügt.
Die copyOf()
Methode wird System.arrayCopy()
zum Erstellen einer Kopie des Arrays verwendet, ist jedoch flexibler als clone()
das Kopieren von Teilen eines Arrays.
Wenn Sie nur eine exakte Kopie eines eindimensionalen Arrays wünschen, verwenden Sie clone()
.
byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();
Verwenden Sie für andere Array-Kopiervorgänge System.arrayCopy
/, Arrays.copyOf
wie von Tom vorgeschlagen .
Im Allgemeinen clone
sollte vermieden werden, aber dies ist eine Ausnahme von der Regel.
Sie können System.arrayCopy verwenden . Es kopiert Elemente von einem Quellarray in ein Zielarray. Die Sun-Implementierung verwendet einen handoptimierten Assembler, sodass dies schnell geht.
Java hat tatsächlich so etwas wie memcpy (). Die Unsafe-Klasse verfügt über eine copyMemory () -Methode, die im Wesentlichen mit memcpy () identisch ist. Natürlich bietet es wie memcpy () keinen Schutz vor Speicherüberlagerungen, Datenvernichtung usw. Es ist nicht klar, ob es sich wirklich um memcpy () oder memmove () handelt. Es kann verwendet werden, um von tatsächlichen Adressen zu tatsächlichen Adressen oder von Verweisen zu Referenzen zu kopieren. Beachten Sie, dass Sie bei Verwendung von Referenzen einen Offset angeben müssen (sonst stirbt die JVM so schnell wie möglich).
Unsafe.copyMemory () funktioniert (bis zu 2 GB pro Sekunde auf meinem alten müden PC). Benutzung auf eigene Gefahr. Beachten Sie, dass die unsichere Klasse nicht für alle JVM-Implementierungen vorhanden ist.
sun.misc.Unsafe
Klasse wird als schlechte Praxis angesehen. "Hack" b / c ist eine private Paketklasse. Ab Java 9 ist es außerdem nicht mehr verfügbar. Der Versuch, diese Klasse zu verwenden, entspricht dem Bitten, dass Ihr Code unerwartet unterbrochen wird.
Sie können System.arraycopy verwenden
Verwenden Sie byteBufferViewVarHandle oder byteArrayViewVarHandle.
Auf diese Weise können Sie ein Array von "Longs" direkt in ein Array von "Doubles" und Ähnlichem kopieren.
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());
Auf diese Weise können Sie Folgendes tun:
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);
Nein, Java hat kein Äquivalent zu memcpy
. Java hat memmove
stattdessen ein Äquivalent zu .
Wenn sich die Argumente src und dest auf dasselbe Array-Objekt beziehen, wird das Kopieren so ausgeführt, als ob die Komponenten an den Positionen srcPos bis srcPos + length-1 zuerst in ein temporäres Array mit Längenkomponenten kopiert wurden und dann der Inhalt des temporären Arrays kopiert in Positionen destPos über destPos + Länge-1 des Zielarrays.
Es ist sehr wahrscheinlich, dass System.arraycopy
es niemals die gleiche Leistung wie memcpy
wenn hat src
und dest
sich auf dasselbe Array bezieht. Normalerweise ist dies jedoch schnell genug.