В този урок ще научите за различни начини, по които можете да копирате масиви (едномерни и двумерни) в 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
В горния пример използвахме оператора за присвояване ( =
), за да копираме масив с имена числа в друг масив, наречен 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. Използване на Looping Construct за копиране на масиви
Да вземем пример:
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. Копиране на 2d масиви с помощта на Loop
Подобно на едномерния масив, ние също можем да копираме двумерния масив, като използваме 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 ().
Копиране на 2d масиви с помощта на 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()
метода.