Подтвердить что ты не робот

Есть ли эквивалент memcpy() в Java?

У меня есть байт [] и вы хотите скопировать его в другой байт []. Может быть, я показываю свой простой "C" фон здесь, но есть ли эквивалент memcpy() на байтовых массивах в Java?

4b9b3361

Ответ 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.

Ответ 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 массива назначения.

Документы Oracle

Весьма вероятно, что System.arraycopy никогда не будет иметь такую же производительность, как memcpy если src и dest ссылаются на один и тот же массив. Обычно это будет достаточно быстро, хотя.