Mam bajt [] i chciałbym go skopiować do innego bajtu []. Może pokazuję tutaj moje proste tło „C”, ale czy istnieje odpowiednik memcpy () w tablicach bajtowych w Javie?
Odpowiedzi:
Możesz spróbować System.arraycopy
lub skorzystać z funkcji tablicowych w takiej Arrays
klasie java.util.Arrays.copyOf
. Oba powinny zapewniać natywną wydajność pod maską.
Arrays.copyOf jest prawdopodobnie korzystny dla czytelności, ale został wprowadzony dopiero w java 1.6.
byte[] src = {1, 2, 3, 4};
byte[] dst = Arrays.copyOf(src, src.length);
System.out.println(Arrays.toString(dst));
Użyj System.arraycopy ()
System.arraycopy(sourceArray,
sourceStartIndex,
targetArray,
targetStartIndex,
length);
Przykład,
String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);
lub użyj Arrays.copyOf ()
Przykład,
target = Arrays.copyOf(source, length);
java.util.Arrays.copyOf(byte[] source, int length)
został dodany w JDK 1.6. Metoda wykorzystuje zrobić kopię tablicy, ale jest bardziej elastyczny niż ponieważ można zrobić kopie części tablicy.
copyOf()
System.arrayCopy()
clone()
Jeśli potrzebujesz tylko dokładnej kopii jednowymiarowej tablicy, użyj clone()
.
byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();
W przypadku innych operacji kopiowania tablicy użyj System.arrayCopy
/ Arrays.copyOf
tak, jak sugeruje Tom .
Generalnie clone
należy tego unikać, ale jest to wyjątek od reguły.
Możesz użyć System.arrayCopy . Kopiuje elementy z tablicy źródłowej do tablicy docelowej. Implementacja Sun wykorzystuje zoptymalizowany ręcznie asembler, więc jest to szybkie.
W rzeczywistości Java ma coś podobnego do memcpy (). Klasa Unsafe ma metodę copyMemory (), która jest zasadniczo identyczna z memcpy (). Oczywiście, podobnie jak memcpy (), nie zapewnia ochrony przed nakładaniem się pamięci, zniszczeniem danych itp. Nie jest jasne, czy jest to rzeczywiście memcpy () czy memmove (). Można go używać do kopiowania adresów rzeczywistych na adresy rzeczywiste lub odwołań do odwołań. Zwróć uwagę, że jeśli używane są odniesienia, musisz podać przesunięcie (w przeciwnym razie JVM umrze jak najszybciej).
Unsafe.copyMemory () działa (do 2 GB na sekundę na moim starym, zmęczonym komputerze). Używaj na własne ryzyko. Należy zauważyć, że klasa Unsafe nie istnieje dla wszystkich implementacji maszyny JVM.
sun.misc.Unsafe
klasy jest uważane za złą praktykę "hack", bo jest to prywatna klasa pakietu. Ponadto, począwszy od Java 9, nie będzie już dostępna, więc próba użycia tej klasy jest tym samym, co błaganie o nieoczekiwane zepsucie kodu.
Możesz użyć System.arraycopy
Jeśli używasz JDK 1.5+, powinieneś używać
System.arraycopy()
Zamiast
Arrays.copyOfRange()
Beacuse Arrays.copyOfRange () nie został dodany do JDK 1.6, więc możesz dostać
Java - “Cannot Find Symbol” error
podczas wywoływania Arrays.copyOfRange w tej wersji JDK.
Użyj byteBufferViewVarHandle lub byteArrayViewVarHandle.
Umożliwi to skopiowanie tablicy „longs” bezpośrednio do tablicy „double” i podobne z czymś takim:
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());
To pozwoli ci zrobić trochę hakowania, takie jak:
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);
Nie. Java nie ma odpowiednika memcpy
. memmove
Zamiast tego Java ma odpowiednik .
Jeśli argumenty src i dest odwołują się do tego samego obiektu tablicy, to kopiowanie jest wykonywane tak, jakby komponenty w pozycjach od srcPos do srcPos + length-1 zostały najpierw skopiowane do tymczasowej tablicy ze składnikami długości, a następnie zawartość tymczasowej tablicy została skopiowane na pozycje od destPos do destPos + długość-1 tablicy docelowej.
Jest bardzo prawdopodobne, System.arraycopy
że nigdy nie będzie miał takiej samej wydajności, jak memcpy
gdyby src
i dest
odnosił się do tej samej macierzy. Zwykle będzie to jednak wystarczająco szybkie.