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

Есть ли причина предпочесть System.arraycopy() над clone()?

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

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

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

int[] dest = orig.clone();

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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