Есть ли причина предпочитать System.arraycopy (), а не clone ()? - PullRequest
32 голосов
/ 24 августа 2011

При копировании всего массива я часто видел, как люди пишут:

int[] dest = new int[orig.length];
System.arraycopy(orig, 0, dest, 0, orig.length);

Но мне кажется, что нет причин одобрять это:

int[] dest = orig.clone();

ОниВ любом случае, обе мелкие копии.Вероятно, эти люди просто не понимают, что clone существует.Так есть ли причина не использовать clone?

Ответы [ 4 ]

31 голосов
/ 24 августа 2011
  • clone() создает отдельную копию первого массива со своей собственной ссылкой.
  • System.arraycopy() использует JNI (собственный интерфейс Java) для копирования массива (или его частей), поэтомуэто невероятно быстро, так как вы можете подтвердить здесь ;
  • clone() создает массив new с теми же характеристиками, что и у старого массива, то есть с тем же размером,того же типа и того же содержимого.Обратитесь к здесь для некоторых примеров clone в действии;
  • manual copying, ну, в общем, ручное копирование.Об этом методе особо нечего сказать, за исключением того, что многие считают его наиболее совершенным .
  • arraynew = arrayold не копирует массив;он просто указывает arraynew на адрес памяти arrayold или, другими словами, вы просто присваиваете ссылку старому массиву.
8 голосов
/ 26 августа 2011

Нет. Если вы действительно микробенчмаркинг, то, возможно, в зависимости от того, какую JVM вы используете.Но на самом деле нет.

5 голосов
/ 01 октября 2014

Мне довелось взглянуть на этот вопрос, когда я размышлял над тем же вопросом.Я чувствую, что arraycopy() - это метод, который используется, когда массив предопределен (т. Е. Память уже выделена).Таким образом, накладные расходы, связанные с выделением памяти, не повторяются.

Например, представьте себе случай, когда вы определили большой массив, который периодически обновляется.Затем использование clone() будет воссоздавать массив требуемого размера каждый раз, когда массив копируется.Однако arraycopy() использует предварительно выделенное пространство памяти.

Таким образом, arraycopy() более эффективен в определенных сценариях по сравнению с clone().С другой стороны, clone() приводит к компактному коду.

1 голос
/ 24 августа 2011

Просто угадайте здесь, но может быть веская причина для использования System.arraycopy, потому что разные JVM могли бы реализовать их таким образом, чтобы использовать преимущества собственных возможностей базовой системы для повышения производительности.

Например, реализация JVM может использовать собственный вызов библиотеки, такой как memcpy, который потенциально может использовать некоторые приемы контроллера памяти для выполнения действия невероятно быстрым и умным способом. Однако реализация Object.clone не может быть хорошим кандидатом для такой оптимизации из-за ее виртуальной природы.

...