Biorąc pod uwagę tablicę, musimy skopiować jej elementy do innej tablicy, naiwnemu użytkownikowi przychodzi na myśl poniższy sposób, który jest jednak niepoprawny, jak pokazano poniżej:
// 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;>
Wyjście:
Wyjaśnienie wyjścia: Kiedy robimy b = a, tak naprawdę przypisujemy odwołanie do tablicy. Zatem jeśli dokonamy jakiejkolwiek zmiany w jednej tablicy, zostanie to odzwierciedlone również w innych tablicach, ponieważ zarówno a, jak i b odnoszą się do tej samej lokalizacji. Możemy to również zweryfikować za pomocą kodu pokazanego poniżej w następujący sposób:
Przykład:
Jawa
// 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] + ' '); } }> |
>
>Wyjście
Contents of a[] 2 8 3 Contents of b[] 2 8 3>
Metody:
Widzieliśmy, że wewnętrzne działania podczas kopiowania elementów i przypadków brzegowych należy wziąć pod uwagę po pokonaniu błędów wygenerowanych powyżej, więc teraz możemy zaproponować prawidłowe sposoby kopiowania tablicy, jak pokazano poniżej:
- Iterowanie każdego elementu danej oryginalnej tablicy i kopiowanie jednego elementu na raz
- Używanie metody clone().
- Korzystanie z metody arraycopy().
- Użycie metody copyOf() klasy Arrays
- Użycie metody copyOfRange() klasy Arrays
Metoda 1: Iterowanie każdego elementu danej oryginalnej tablicy i kopiowanie jednego elementu na raz. Dzięki zastosowaniu tej metody gwarantuje się, że wszelkie modyfikacje b nie zmienią oryginalnej tablicy a, jak pokazano w poniższym przykładzie w następujący sposób:
Przykład:
Jawa
// 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] + ' '); } }> |
>
>Wyjście
losowa liczba od 1 do 10
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 2: Korzystanie z metody Clone().
W poprzedniej metodzie musieliśmy iterować po całej tablicy, aby utworzyć kopię. Czy możemy zrobić lepiej? Tak, możemy użyć metody klonowania w Javie.
Przykład:
Jawa
// 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] + ' '); } }> |
>
>Wyjście
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 3: Korzystanie z metody arraycopy().
Możemy również skorzystać System.arraycopy() Metoda. System występuje w pakiecie java.lang. Jego podpis brzmi następująco:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)>
Parametry:
- źródło oznacza tablicę źródłową.
- srcPoz jest indeksem, od którego rozpoczyna się kopiowanie.
- początek oznacza tablicę docelową
- docelowePoz jest indeksem, z którego skopiowane elementy są umieszczane w tablicy docelowej.
- długość jest długością podtablicy do skopiowania.
Przykład:
Jawa
lista 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] + ' '); } }> |
>
>Wyjście
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 4: Użycie metody copyOf() klasy Arrays
Jeśli chcemy skopiować kilka pierwszych elementów tablicy lub pełną kopię tablicy, możesz skorzystać z tej metody.
Składnia:
public static int[] copyOf?(int[] original, int newLength)>
Parametry:
- Oryginalna tablica
- Długość tablicy do skopiowania.
Przykład:
Jawa
// 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] + ' '); } }> |
>
>Wyjście
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 5: Użycie metody copyOfRange() klasy Arrays
Ta metoda kopiuje określony zakres określonej tablicy do nowej tablicy.
public static int[] copyOfRange?(int[] original, int from, int to)>
Parametry:
- Oryginalna tablica, z której ma zostać skopiowany zakres
- Początkowy indeks zakresu do skopiowania
- Końcowy indeks zakresu do skopiowania, wyłączny
Przykład:
Jawa
// 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] + ' '); } }> |
>
>Wyjście
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10>
Na koniec porozmawiajmy o przegląd powyższych metod:
- Samo przypisywanie referencji jest błędne
- Tablicę można skopiować, iterując po tablicy i przypisując elementy jeden po drugim.
- Możemy uniknąć iteracji po elementach za pomocą clone() lub System.arraycopy()
- clone() tworzy nową tablicę o tym samym rozmiarze, ale System.arraycopy() można użyć do kopiowania z zakresu źródłowego do zakresu docelowego.
- System.arraycopy() jest szybsza niż clone(), ponieważ wykorzystuje natywny interfejs Java
- Jeśli chcesz skopiować kilka pierwszych elementów tablicy lub pełną kopię tablicy, możesz użyć metody Arrays.copyOf().
- Arrays.copyOfRange() służy do kopiowania określonego zakresu tablicy. Jeśli indeks początkowy nie wynosi 0, możesz użyć tej metody do skopiowania częściowej tablicy.