Массивы копирования Java (с использованием System arraycopy (), конструкции цикла и т. Д.)

В этом руководстве вы узнаете о различных способах копирования массивов (как одномерных, так и двумерных) в Java с помощью примеров.

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

1. Копирование массивов с помощью оператора присваивания

Возьмем пример,

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Выход :

 1, 2, 3, 4, 5, 6

В приведенном выше примере мы использовали оператор присваивания ( =), чтобы скопировать массив с именем numbers в другой массив с именем positiveNumbers.

Это самый простой способ, и он тоже работает. Однако у этой техники есть проблема. Если мы меняем элементы одного массива, соответствующие элементы других массивов также изменяются. Например,

 class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays // change value of first array numbers(0) = -1; // printing the second array for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )

Выход :

 -1, 2, 3, 4, 5, 6

Здесь мы видим, что мы изменили одно значение массива чисел. Когда мы печатаем массив PositiveNumbers, мы видим, что это же значение также изменяется.

Это потому, что оба массива относятся к одному и тому же объекту массива. Это из-за неглубокой копии. Чтобы узнать больше о мелкой копии, посетите мелкую копию.

Теперь, чтобы создавать новые объекты массива при копировании массивов, нам нужна глубокая копия, а не мелкая копия.

2. Использование конструкции цикла для копирования массивов

Возьмем пример:

 import java.util.Arrays; class Main ( public static void main(String() args) ( int () source = (1, 2, 3, 4, 5, 6); int () destination = new int(6); // iterate and copy elements from source to destination for (int i = 0; i < source.length; ++i) ( destination(i) = source(i); ) // converting array to string System.out.println(Arrays.toString(destination)); ) )

Выход :

 (1, 2, 3, 4, 5, 6)

В приведенном выше примере мы использовали forцикл для перебора каждого элемента исходного массива. На каждой итерации мы копируем элементы из исходного массива в целевой массив.

Здесь исходный и целевой массивы относятся к разным объектам (глубокая копия). Следовательно, при изменении элементов одного массива соответствующие элементы другого массива не изменяются.

Обратите внимание на заявление,

 System.out.println(Arrays.toString(destination));

Здесь метод toString () используется для преобразования массива в строку. Чтобы узнать больше, посетите метод toString () (официальная документация Java).

3. Копирование массивов с помощью метода arraycopy ()

В Java класс System содержит метод arraycopy()копирования массивов. Этот метод лучше подходит для копирования массивов, чем два вышеупомянутых.

arraycopy()Метод позволяет копировать определенную часть исходного массива в массив назначения. Например,

 arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

Вот,

  • src - исходный массив, который вы хотите скопировать
  • srcPos - начальная позиция (индекс) в исходном массиве
  • dest - целевой массив, куда элементы будут скопированы из источника
  • destPos - начальная позиция (индекс) в целевом массиве
  • длина - количество элементов для копирования

Возьмем пример:

 // To use Arrays.toString() method import java.util.Arrays; class Main ( public static void main(String() args) ( int() n1 = (2, 3, 12, 4, 12, -2); int() n3 = new int(5); // Creating n2 array of having length of n1 array int() n2 = new int(n1.length); // copying entire n1 array to n2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); // copying elements from index 2 on n1 array // copying element to index 1 of n3 array // 2 elements will be copied System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); ) )

Выход :

 n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)

В приведенном выше примере мы использовали arraycopy()метод,

  • System.arraycopy(n1, 0, n2, 0, n1.length) - целые элементы из массива n1 копируются в массив n2
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 элемента массива n1, начиная с индекса 2, копируются в индекс начиная с 1 массива n3

Как видите, начальное значение по умолчанию для элементов массива типа int равно 0.

4. Копирование массивов с помощью метода copyOfRange ()

Мы также можем использовать метод copyOfRange (), определенный в классе Java Arrays, для копирования массивов. Например,

 // To use toString() and copyOfRange() method import java.util.Arrays; class ArraysCopy ( public static void main(String() args) ( int() source = (2, 3, 12, 4, 12, -2); // copying entire source array to destination int() destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); // copying from index 2 to 5 (5 is not included) int() destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); ) )

Вывод

 пункт назначения1 = (2, 3, 12, 4, 12, -2) пункт назначения2 = (12, 4, 12)

В приведенном выше примере обратите внимание на строку

 int() destination1 = Arrays.copyOfRange(source, 0, source.length);

Здесь мы видим, что мы создаем массив destination1 и одновременно копируем в него исходный массив. Мы не создаем массив destination1 перед вызовом copyOfRange()метода. Чтобы узнать больше о методе, посетите Java copyOfRange.

5. Копирование двумерных массивов с помощью цикла

Подобно одномерному массиву, мы также можем скопировать двухмерный массив с помощью forцикла. Например,

 import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); int()() destination = new int(source.length)(); for (int i = 0; i < destination.length; ++i) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); for (int j = 0; j < destination(i).length; ++j) ( destination(i)(j) = source(i)(j); ) ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Выход :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

В приведенной выше программе обратите внимание на строку

 System.out.println(Arrays.deepToString(destination);

Здесь этот deepToString()метод используется для лучшего представления двумерного массива. Чтобы узнать больше, посетите Java deepToString ().

Копирование двумерных массивов с помощью arraycopy ()

Чтобы упростить приведенный выше код, мы можем заменить внутренний цикл на, System.arraycopy()как в случае с одномерным массивом. Например,

 import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); int()() destination = new int(source.length)(); for (int i = 0; i < source.length; ++i) ( // allocating space for each row of destination array destination(i) = new int(source(i).length); System.arraycopy(source(i), 0, destination(i), 0, destination(i).length); ) // displaying destination array System.out.println(Arrays.deepToString(destination)); ) )

Выход :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

Здесь мы видим, что получаем тот же результат, заменяя внутренний forцикл arraycopy()методом.

Интересные статьи...