У мене є байт [], і я хотів би скопіювати його в інший байт []. Можливо, я показую тут свій простий фон "C", але чи існує еквівалент memcpy () на байтових масивах у Java?
Відповіді:
Ви можете спробувати System.arraycopy
або використати функції масиву в Arrays
класі, наприклад java.util.Arrays.copyOf
. І те, і інше повинно забезпечити вам природну ефективність під капотом.
Arrays.copyOf, ймовірно, сприятливий для читабельності, але був представлений лише в Java 1.6.
byte[] src = {1, 2, 3, 4};
byte[] dst = Arrays.copyOf(src, src.length);
System.out.println(Arrays.toString(dst));
Використовуйте System.arraycopy ()
System.arraycopy(sourceArray,
sourceStartIndex,
targetArray,
targetStartIndex,
length);
Приклад,
String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);
або скористайтеся прикладом Arrays.copyOf ()
,
target = Arrays.copyOf(source, length);
java.util.Arrays.copyOf(byte[] source, int length)
було додано в JDK 1.6. Метод використовує , щоб зробити копію масиву, але є більш гнучким , ніж , так як ви можете робити копії частин масиву.
copyOf()
System.arrayCopy()
clone()
Якщо ви просто хочете отримати точну копію одновимірного масиву, використовуйте clone()
.
byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();
Для інших операцій копіювання масиву використовуйте System.arrayCopy
/ Arrays.copyOf
як пропонує Том .
Загалом, clone
слід уникати, але це виняток із правила.
Ви можете використовувати System.arrayCopy . Він копіює елементи з вихідного масиву в масив призначення. Реалізація Sun використовує оптимізований вручну асемблер, тому це швидко.
Java насправді має щось подібне до memcpy (). Клас Unsafe має метод copyMemory (), який по суті ідентичний memcpy (). Звичайно, як і memcpy (), він не забезпечує захисту від накладання пам’яті, знищення даних тощо. Незрозуміло, чи це справді memcpy () чи memmove (). Його можна використовувати для копіювання з фактичних адрес на фактичні адреси або з посилань на посилання. Зверніть увагу, що якщо використовуються посилання, ви повинні надати зсув (інакше JVM загине якомога швидше).
Працює Unsafe.copyMemory () (до 2 Гб на секунду на моєму старому втомленому ПК). Використовуйте на власний ризик. Зауважте, що небезпечний клас існує не для всіх реалізацій JVM.
sun.misc.Unsafe
класу вважається поганою практикою "зламати" b / c, це приватний пакетний клас. Крім того, починаючи з Java 9, він більше не буде доступним, тому спроба використовувати цей клас - це те саме, що благати, щоб ваш код несподівано зламався.
Ви можете використовувати System.arraycopy
Коли ви використовуєте JDK 1.5+, вам слід використовувати
System.arraycopy()
Замість
Arrays.copyOfRange()
Beacuse Arrays.copyOfRange () не був доданий до JDK 1.6. Отже, ви можете отримати
Java - “Cannot Find Symbol” error
при виклику Arrays.copyOfRange у цій версії JDK.
Використовуйте byteBufferViewVarHandle або byteArrayViewVarHandle.
Це дозволить вам скопіювати масив "longs" безпосередньо в масив "double" і тому подібне, наприклад:
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());
Це дозволить вам зробити хакерство на зразок:
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);
Ні. Java не має еквівалента memcpy
. Java має еквівалент memmove
замість цього.
Якщо аргументи src і dest посилаються на один і той же об'єкт масиву, то копіювання виконується так, ніби компоненти в позиціях srcPos через srcPos + length-1 спочатку скопіювали у тимчасовий масив із компонентами length, а потім вміст тимчасового масиву було скопійовано в позиції destPos через destPos + довжина-1 масиву призначення.
Дуже ймовірно System.arraycopy
, ніколи не буде однакової продуктивності, як memcpy
ніби, src
і буде dest
посилатися на один і той же масив. Зазвичай це буде досить швидко.