В этом руководстве вы узнаете о различных способах копирования массивов (как одномерных, так и двумерных) в 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 копируются в массив n2System.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()
методом.