Ответ 1
Нет. Если вы действительно являетесь микробизнесом, то, возможно, в зависимости от того, какой JVM вы используете. Но на самом деле нет.
При копировании всего массива я часто видел, как люди пишут:
int[] dest = new int[orig.length];
System.arraycopy(orig, 0, dest, 0, orig.length);
Но мне кажется, что нет оснований одобрять это:
int[] dest = orig.clone();
В любом случае они оба мелкие копии. Вероятно, эти люди просто не понимают, что существует clone
. Итак, есть ли причина не использовать clone
?
Нет. Если вы действительно являетесь микробизнесом, то, возможно, в зависимости от того, какой JVM вы используете. Но на самом деле нет.
clone()
делает отдельную копию первого массива со своей ссылкой.System.arraycopy()
использует JNI (Java Native Interface) для копирования
массив (или его части), так что это
невероятно быстро, как вы можете подтвердить
здесь;clone()
создает массив new с теми же характеристиками, что и старый массив, т.е. тот же размер, тот же тип и то же содержимое. Обратитесь к здесь для некоторых примеров clone
в действии;manual copying
есть, ну, ручное копирование. Об этом методе говорить нечего, за исключением того, что многие люди считают его наиболее эффективным .arraynew = arrayold
не копирует массив; он просто указывает arraynew
на адрес памяти arrayold
или, другими словами, вы просто назначаете ссылку для старого массива.Мне довелось посмотреть на этот вопрос, когда я размышлял над тем же сомнением. Я чувствую, что arraycopy()
- это метод, который будет использоваться, когда массив предопределен (т.е. Память уже выделена). Таким образом, служебные данные, связанные с распределением памяти, не повторяются.
Например, представьте случай, когда вы определили большой массив, который периодически обновляется. Затем использование clone()
будет воссоздавать массив требуемого размера каждый раз при копировании массива. Однако arraycopy()
использует предварительно выделенное пространство памяти.
Таким образом, arraycopy()
более эффективен в определенных сценариях по сравнению с clone()
. С другой стороны, clone()
приводит к компактному коду.
Просто угадай здесь, но может быть веская причина использовать System.arraycopy
, потому что разные JVM могли бы реализовать их таким образом, чтобы использовать преимущества встроенных возможностей базовой системы для повышения производительности.
Например, реализация JVM может использовать вызов библиотеки, такой как memcpy
, который потенциально может использовать некоторые трюки контроллера памяти для выполнения действия невероятно быстрым и умным способом. Однако реализация Object.clone
не может быть хорошим кандидатом для такой оптимизации из-за ее виртуального характера.