В чем разница между
-
System.arraycopy()
, -
clone()
- ручное копирование путем итерации через элементы
-
Arrays.copyOf()
- и просто делать
arraynew = arrayold
?
В чем разница между
System.arraycopy()
,clone()
Arrays.copyOf()
arraynew = arrayold
?System.arraycopy()
использует JNI (Java Native Interface) для копирования
массив (или его части), так что это
невероятно быстро, как вы можете подтвердить
здесь;clone()
создает массив new с теми же характеристиками, что и старый массив, т.е. тот же размер, тот же тип и одно и то же содержимое. Обратитесь к здесь для некоторых примеров clone
в действии;manual copying
- это, конечно, ручное копирование. Об этом методе говорить нечего, за исключением того, что многие люди считают его наиболее эффективным .arraynew = arrayold
не копирует массив; он просто указывает arraynew
на адрес памяти arrayold
или, другими словами, вы просто присваиваете старый массив .System.arraycopy()
копирует данные из одного существующего массива в другой и в зависимости от аргументов копирует только его части.clone()
выделяет новый массив, который имеет тот же тип и размер, что и оригинал, и гарантирует, что он имеет тот же контент.System.arraycopy()
, но это больше кода и, следовательно, более мощный источник ошибокarraynew = arrayold
только копирует ссылку на массив на новую переменную и не влияет на сам массивЕсть еще одна полезная опция:
Arrays.copyOf()
можно использовать для создания копии другого массива другого размера. Это означает, что новый массив может быть больше или больше исходного массива, а содержимое общего размера будет иметь размер источника. Там даже версия, которая позволяет создавать массив другого типа и версию, где вы можете указать диапазон элементов для копирования (Array.copyOfRange()
).
Обратите внимание, что все эти методы делают мелкие копии. Это означает, что только ссылки, хранящиеся в массивах, копируются, а ссылочные объекты не дублируются.
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.
Примечание. Нет смысла сравнивать скорость, очевидно, потому что их функциональность отличается.