Разница между различными методами копирования Array
В чем разница между
-
System.arraycopy()
,
-
clone()
- ручное копирование путем итерации через элементы
-
Arrays.copyOf()
- и просто делать
arraynew = arrayold
?
Ответы
Ответ 1
-
System.arraycopy()
использует JNI (Java Native Interface) для копирования
массив (или его части), так что это
невероятно быстро, как вы можете подтвердить
здесь;
-
clone()
создает массив new с теми же характеристиками, что и старый массив, т.е. тот же размер, тот же тип и одно и то же содержимое. Обратитесь к здесь для некоторых примеров clone
в действии;
-
manual copying
- это, конечно, ручное копирование. Об этом методе говорить нечего, за исключением того, что многие люди считают его наиболее эффективным .
-
arraynew = arrayold
не копирует массив; он просто указывает arraynew
на адрес памяти arrayold
или, другими словами, вы просто присваиваете старый массив .
Ответ 2
-
System.arraycopy()
копирует данные из одного существующего массива в другой и в зависимости от аргументов копирует только его части.
-
clone()
выделяет новый массив, который имеет тот же тип и размер, что и оригинал, и гарантирует, что он имеет тот же контент.
- ручное копирование обычно делает почти то же самое, что и
System.arraycopy()
, но это больше кода и, следовательно, более мощный источник ошибок
-
arraynew = arrayold
только копирует ссылку на массив на новую переменную и не влияет на сам массив
Есть еще одна полезная опция:
Arrays.copyOf()
можно использовать для создания копии другого массива другого размера. Это означает, что новый массив может быть больше или больше исходного массива, а содержимое общего размера будет иметь размер источника. Там даже версия, которая позволяет создавать массив другого типа и версию, где вы можете указать диапазон элементов для копирования (Array.copyOfRange()
).
Обратите внимание, что все эти методы делают мелкие копии. Это означает, что только ссылки, хранящиеся в массивах, копируются, а ссылочные объекты не дублируются.
Ответ 3
Arrays.copyOf(..) использует метод System.arrayCopy(..) внутри.
Ответ 4
Есть ответы, но не полные.
Рассматриваемые варианты:
- Arrays.copyOf()
- System.arraycopy()
Ниже приведена реализация Java в Arrays.copyOf()
public static double[] More ...copyOf(double[] original, int newLength) {
double[] copy = new double[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
Как вы можете видеть, copyOf внутренне использует System.arraycopy.
- Если у вас уже создан массив, используйте System.arraycopy(), чтобы скопировать
- Если вам нужен результат в новом массиве, используйте Arrays.copyOf(), чтобы скопировать
Примечание. Нет смысла сравнивать скорость, очевидно, потому что их функциональность отличается.