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?
81
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 ()
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,
java.util.Arrays.copyOf(byte[] source, int length)
wurde in JDK 1.6 hinzugefügt.Die
copyOf()
Methode wirdSystem.arrayCopy()
zum Erstellen einer Kopie des Arrays verwendet, ist jedoch flexibler alsclone()
das Kopieren von Teilen eines Arrays.quelle
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.quelle
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.
quelle
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.
quelle
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
quelle
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);
quelle
Nein, Java hat kein Äquivalent zu
memcpy
. Java hatmemmove
stattdessen ein Äquivalent zu .Oracle Docs
Es ist sehr wahrscheinlich, dass
System.arraycopy
es niemals die gleiche Leistung wiememcpy
wenn hatsrc
unddest
sich auf dasselbe Array bezieht. Normalerweise ist dies jedoch schnell genug.quelle