У меня есть байт [] и вы хотите скопировать его в другой байт []. Может быть, я показываю свой простой "C" фон здесь, но есть ли эквивалент memcpy() на байтовых массивах в Java?
Есть ли эквивалент memcpy() в Java?
Ответ 1
Вы можете попробовать 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));
Ответ 2
Используйте 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()
, поскольку вы можете создавать копии частей массива.
Ответ 3
Если вам нужна только точная копия одномерного массива, используйте clone()
.
byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();
Для других операций копирования массива используйте System.arrayCopy
/Arrays.copyOf
как Том предлагает.
В общем случае следует избегать clone
, но это исключение из правила.
Ответ 4
Вы можете использовать System.arrayCopy. Он копирует элементы из исходного массива в целевой массив. Реализация Sun использует оптимизированный вручную ассемблер, так что это быстро.
Ответ 5
У Java действительно есть что-то вроде memcpy(). Класс Unsafe имеет метод copyMemory(), который по существу идентичен memcpy(). Конечно, как memcpy(), он не защищает от наложений памяти, уничтожения данных и т.д. Неясно, действительно ли это memcpy() или memmove(). Его можно использовать для копирования с фактических адресов на фактические адреса или из ссылок на ссылки. Обратите внимание, что если ссылки используются, вы должны предоставить смещение (или JVM будет умирать как можно скорее).
Unsafe.copyMemory() работает (до 2 ГБ в секунду на моем усталом ПК). Используйте на свой риск. Обратите внимание, что класс Unsafe не существует для всех реализаций JVM.
Ответ 6
Вы можете использовать System.arraycopy
Ответ 7
Используйте byteBufferViewVarHandle или byteArrayViewVarHandle.
Это позволит вам скопировать массив "long" непосредственно в массив "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);
Ответ 8
Нет, у Java нет эквивалента memcpy
. memmove
этого Java имеет эквивалент memmove
.
Если аргументы src и dest ссылаются на один и тот же объект массива, то копирование выполняется так, как если бы компоненты в позициях srcPos - srcPos + length-1 сначала были скопированы во временный массив с компонентами длины, а затем содержимое временного массива было копируется в позиции destPos через destPos + length-1 массива назначения.
Весьма вероятно, что System.arraycopy
никогда не будет иметь такую же производительность, как memcpy
если src
и dest
ссылаются на один и тот же массив. Обычно это будет достаточно быстро, хотя.