logo

Копіювання масиву в Java

Маючи масив, нам потрібно скопіювати його елементи в інший масив, наївному користувачеві спадає на думку наведений нижче спосіб, який, однак, є неправильним, як показано нижче:

// 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>

Методи:

Ми бачили внутрішню роботу під час копіювання елементів і краєвих випадків, які слід враховувати після отримання помилок, як згенеровано вище, тому тепер ми можемо запропонувати правильні способи копіювання масиву, як зазначено нижче:

  1. Ітерація кожного елемента заданого вихідного масиву та копіювання по одному елементу за раз
  2. Використання методу clone().
  3. Використання методу arraycopy().
  4. Використання методу copyOf() класу Arrays
  5. Використання методу 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, ви можете використовувати цей метод для копіювання часткового масиву.