У цьому підручнику ви дізнаєтесь про різні способи копіювання масивів (як одновимірних, так і двовимірних) в 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. Використання циклічної конструкції для копіювання масивів
Візьмемо приклад:
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 - початкова позиція (індекс) у цільовому масиві
- length - кількість елементів для копіювання
Візьмемо приклад:
// 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)); ) )
Вихідні дані
пункт призначення = = (2, 3, 12, 4, 12, -2) пункт призначення = = (12, 4, 12)
У наведеному вище прикладі зверніть увагу на рядок,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Тут ми бачимо, що ми створюємо масив destination1 і одночасно копіюємо в нього вихідний масив. Ми не створюємо масив destination1 перед викликом copyOfRange()
методу. Щоб дізнатись більше про метод, відвідайте Java copyOfRange.
5. Копіювання 2d-масивів за допомогою циклу
Подібно одновимірному масиву, ми також можемо скопіювати двовимірний масив, використовуючи 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()
методом.