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

Разница между различными методами копирования Array

В чем разница между

  • System.arraycopy(),
  • clone()
  • ручное копирование путем итерации через элементы
  • Arrays.copyOf()
  • и просто делать arraynew = arrayold?
4b9b3361

Ответ 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(), чтобы скопировать

Примечание. Нет смысла сравнивать скорость, очевидно, потому что их функциональность отличается.