Маючи масив, нам потрібно скопіювати його елементи в інший масив, наївному користувачеві спадає на думку наведений нижче спосіб, який, однак, є неправильним, як показано нижче:
// Java Program to Illustrate Wrong Way Of Copying an Array // Input array int a[] = { 1, 8, 3 }; // Creating an array b[] of same size as a[] int b[] = new int[a.length]; // Doesn't copy elements of a[] to b[], only makes // b refer to same location b = a;>
Вихід:
Пояснення результату: Коли ми робимо b = a, ми фактично призначаємо посилання на масив. Отже, якщо ми вносимо будь-які зміни в один масив, це також буде відображено в інших масивах, тому що і a, і b посилаються на те саме розташування. Ми також можемо перевірити це за допомогою коду, як показано нижче:
приклад:
Java
// A Java program to demonstrate that simply> // assigning one array reference is incorrect> public> class> Test {> > public> static> void> main(String[] args)> > {> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Doesn't copy elements of a[] to b[],> > // only makes b refer to same location> > b = a;> > > // Change to b[] will also reflect in a[]> > // as 'a' and 'b' refer to same location.> > b[> 0> ]++;> > > System.out.println(> 'Contents of a[] '> );> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Вихід
Contents of a[] 2 8 3 Contents of b[] 2 8 3>
Методи:
Ми бачили внутрішню роботу під час копіювання елементів і краєвих випадків, які слід враховувати після отримання помилок, як згенеровано вище, тому тепер ми можемо запропонувати правильні способи копіювання масиву, як зазначено нижче:
- Ітерація кожного елемента заданого вихідного масиву та копіювання по одному елементу за раз
- Використання методу clone().
- Використання методу arraycopy().
- Використання методу copyOf() класу Arrays
- Використання методу copyOfRange() класу Arrays
Спосіб 1: Ітерація кожного елемента заданого вихідного масиву та копіювання по одному елементу за раз. Використання цього методу гарантує, що будь-які модифікації b не змінять оригінальний масив a, як показано в прикладі нижче:
приклад:
Java
// Java program to demonstrate copying by> // one by one assigning elements between arrays> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Input array a[]> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Copying elements of a[] to b[]> > for> (> int> i => 0> ; i b[i] = a[i]; // Changing b[] to verify that // b[] is different from a[] b[0]++; // Display message only System.out.println('Contents of a[] '); for (int i = 0; i System.out.print(a[i] + ' '); // Display message only System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Вихід
Команда linux для zip
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Спосіб 2: Використання методу Clone().
У попередньому методі нам довелося повторити весь масив, щоб створити копію, чи можемо ми зробити це краще? Так, ми можемо використовувати метод клонування в Java.
приклад:
Java
// Java program to demonstrate Copying of Array> // using clone() method> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Input array a[]> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Copying elements of a[] to b[]> > int> b[] = a.clone();> > > // Changing b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > // Display message for better readability> > System.out.println(> 'Contents of a[] '> );> > > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Display message for better readability System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Вихід
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Спосіб 3: Використання методу arraycopy().
Ми також можемо використовувати System.arraycopy() метод. Система присутня в пакеті java.lang. Його підпис такий:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)>
Параметри:
- src позначає вихідний масив.
- srcPos це індекс, з якого починається копіювання.
- почати позначає масив призначення
- destPos це індекс, з якого скопійовані елементи розміщуються в цільовому масиві.
- довжина це довжина підмасиву, який потрібно скопіювати.
приклад:
Java
// Java program to demonstrate array> // copy using System.arraycopy()> > // Main class> public> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Creating an array b[] of same size as a[]> > int> b[] => new> int> [a.length];> > > // Copying elements of a[] to b[]> > System.arraycopy(a,> 0> , b,> 0> ,> 3> );> > > // Changing b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > // Display message only> > System.out.println(> 'Contents of a[] '> );> > > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Display message only System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Вихід
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Спосіб 4: Використання методу copyOf() класу Arrays
Якщо ми хочемо скопіювати кілька перших елементів масиву або повну копію масиву, ви можете скористатися цим методом.
Синтаксис:
public static int[] copyOf?(int[] original, int newLength)>
Параметри:
- Оригінальний масив
- Довжина масиву, який потрібно скопіювати.
приклад:
Java
// Java program to demonstrate array> // copy using Arrays.copyOf()> > // Importing Arrays class from utility class> import> java.util.Arrays;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> };> > > // Create an array b[] of same size as a[]> > // Copy elements of a[] to b[]> > int> b[] = Arrays.copyOf(a,> 3> );> > > // Change b[] to verify that> > // b[] is different from a[]> > b[> 0> ]++;> > > System.out.println(> 'Contents of a[] '> );> > > // Iterating over array. a[]> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); System.out.println('
Contents of b[] '); // Iterating over array b[] for (int i = 0; i System.out.print(b[i] + ' '); } }> |
mb проти gb
>
>Вихід
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Спосіб 5: Використання методу copyOfRange() класу Arrays
Цей метод копіює вказаний діапазон зазначеного масиву в новий масив.
public static int[] copyOfRange?(int[] original, int from, int to)>
Параметри:
- Вихідний масив, з якого потрібно скопіювати діапазон
- Початковий індекс діапазону для копіювання
- Остаточний індекс діапазону для копіювання, винятковий
приклад:
Java
// Java program to demonstrate array> // copy using Arrays.copyOfRange()> > // Importing Arrays class from utility package> import> java.util.Arrays;> > // Main class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Custom input array> > int> a[] = {> 1> ,> 8> ,> 3> ,> 5> ,> 9> ,> 10> };> > > // Creating an array b[] and> > // copying elements of a[] to b[]> > int> b[] = Arrays.copyOfRange(a,> 2> ,> 6> );> > > // Changing b[] to verify that> > // b[] is different from a[]> > > // Iterating over array a[]> > System.out.println(> 'Contents of a[] '> );> > for> (> int> i => 0> ; i System.out.print(a[i] + ' '); // Iterating over array b[] System.out.println('
Contents of b[] '); for (int i = 0; i System.out.print(b[i] + ' '); } }> |
>
>Вихід
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10>
Нарешті, давайте обговоримо огляд вищевказаних методів:
- Просто призначати посилання неправильно
- Масив можна скопіювати шляхом ітерації по масиву та почергового призначення елементів.
- Ми можемо уникнути повторення елементів за допомогою clone() або System.arraycopy()
- clone() створює новий масив такого ж розміру, але System.arraycopy() можна використовувати для копіювання з діапазону джерела в діапазон призначення.
- System.arraycopy() швидший за clone(), оскільки використовує рідний інтерфейс Java
- Якщо ви хочете скопіювати кілька перших елементів масиву або повну копію масиву, ви можете використовувати метод Arrays.copyOf().
- Arrays.copyOfRange() використовується для копіювання вказаного діапазону масиву. Якщо початковий індекс не дорівнює 0, ви можете використовувати цей метод для копіювання часткового масиву.