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?
83
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 ()
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,
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()
źródło
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.źródło
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.
źródło
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.
źródło
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
źródło
Jeśli używasz JDK 1.5+, powinieneś używać
Zamiast
Beacuse Arrays.copyOfRange () nie został dodany do JDK 1.6, więc możesz dostać
podczas wywoływania Arrays.copyOfRange w tej wersji JDK.
źródło
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);
źródło
Nie. Java nie ma odpowiednika
memcpy
.memmove
Zamiast tego Java ma odpowiednik .Oracle Docs
Jest bardzo prawdopodobne,
System.arraycopy
że nigdy nie będzie miał takiej samej wydajności, jakmemcpy
gdybysrc
idest
odnosił się do tej samej macierzy. Zwykle będzie to jednak wystarczająco szybkie.źródło