Tablice kopiowania Java (przy użyciu funkcji arraycopy systemowej (), konstrukcji pętli itd.)

W tym samouczku za pomocą przykładów dowiesz się o różnych sposobach kopiowania tablic (zarówno jednowymiarowych, jak i dwuwymiarowych) w języku Java.

W Javie możemy skopiować jedną tablicę do drugiej. Istnieje kilka technik kopiowania tablic w Javie.

1. Kopiowanie tablic za pomocą operatora przypisania

Weźmy przykład,

 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 + ", "); ) ) )

Wyjście :

 1, 2, 3, 4, 5, 6

W powyższym przykładzie użyliśmy operatora przypisania ( =) do skopiowania tablicy o nazwie liczby do innej tablicy o nazwie dodatnie liczby.

Ta technika jest najłatwiejsza i też działa. Jednak z tą techniką jest problem. Jeśli zmienimy elementy jednej tablicy, zmienią się również odpowiednie elementy innych tablic. Na przykład,

 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 + ", "); ) ) )

Wyjście :

 -1, 2, 3, 4, 5, 6

Tutaj widzimy, że zmieniliśmy jedną wartość tablicy liczb. Kiedy drukujemy tablicę PositiveNumbers, widzimy, że ta sama wartość również się zmienia.

Dzieje się tak, ponieważ obie tablice odwołują się do tego samego obiektu tablicy. To z powodu płytkiej kopii. Aby dowiedzieć się więcej o płytkiej kopii, odwiedź płytką kopię.

Teraz, aby tworzyć nowe obiekty tablicowe podczas kopiowania tablic, potrzebujemy raczej głębokiej kopii niż płytkiej kopii.

2. Używanie konstrukcji pętli do kopiowania tablic

Weźmy przykład:

 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)); ) )

Wyjście :

 (1, 2, 3, 4, 5, 6)

W powyższym przykładzie użyliśmy forpętli do iteracji przez każdy element tablicy źródłowej. W każdej iteracji kopiujemy elementy z tablicy źródłowej do tablicy docelowej.

Tutaj tablica źródłowa i docelowa odnoszą się do różnych obiektów (głęboka kopia). Stąd, jeśli elementy jednej tablicy zostaną zmienione, odpowiadające im elementy innej tablicy pozostają niezmienione.

Zwróć uwagę na oświadczenie,

 System.out.println(Arrays.toString(destination));

W tym przypadku metoda toString () służy do konwersji tablicy na ciąg. Aby dowiedzieć się więcej, odwiedź metodę toString () (oficjalna dokumentacja Java).

3. Kopiowanie tablic przy użyciu metody arraycopy ()

W języku Java klasa System zawiera metodę o nazwie arraycopy()kopiującej tablice. Ta metoda jest lepszym podejściem do kopiowania tablic niż dwie powyższe.

arraycopy()Metoda pozwala na skopiowanie określoną część tablicy źródłowej do tablicy docelowej. Na przykład,

 arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

Tutaj,

  • src - tablica źródłowa, którą chcesz skopiować
  • srcPos - pozycja początkowa (indeks) w tablicy źródłowej
  • dest - tablica docelowa, w której zostaną skopiowane elementy ze źródła
  • destPos - pozycja początkowa (indeks) w tablicy docelowej
  • długość - liczba elementów do skopiowania

Weźmy przykład:

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

Wyjście :

 n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)

W powyższym przykładzie użyliśmy arraycopy()metody

  • System.arraycopy(n1, 0, n2, 0, n1.length) - całe elementy z tablicy n1 są kopiowane do tablicy n2
  • System.arraycopy(n1, 2, n3, 1, 2) - 2 elementy tablicy n1 zaczynające się od indeksu 2 są kopiowane do indeksu zaczynając od 1 tablicy n3

Jak widać, domyślną wartością początkową elementów tablicy typu int jest 0.

4. Kopiowanie tablic przy użyciu metody copyOfRange ()

Do kopiowania tablic możemy również użyć metody copyOfRange () zdefiniowanej w klasie Java Arrays. Na przykład,

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

Wynik

 miejsce docelowe1 = (2, 3, 12, 4, 12, -2) miejsce docelowe2 = (12, 4, 12)

W powyższym przykładzie zwróć uwagę na linię,

 int() destination1 = Arrays.copyOfRange(source, 0, source.length);

Tutaj widzimy, że tworzymy tablicę docelową1 i kopiujemy do niej tablicę źródłową w tym samym czasie. Nie tworzymy tablicy destination1 przed wywołaniem copyOfRange()metody. Aby dowiedzieć się więcej o tej metodzie, odwiedź witrynę Java copyOfRange.

5. Kopiowanie tablic 2d za pomocą pętli

Podobnie jak w przypadku tablicy jednowymiarowej, możemy również skopiować tablicę dwuwymiarową za pomocą forpętli. Na przykład,

 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)); ) )

Wyjście :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

W powyższym programie zwróć uwagę na linię,

 System.out.println(Arrays.deepToString(destination);

Tutaj deepToString()metoda jest używana do zapewnienia lepszej reprezentacji dwuwymiarowej tablicy. Aby dowiedzieć się więcej, odwiedź stronę Java deepToString ().

Kopiowanie tablic 2d przy użyciu funkcji arraycopy ()

Aby uprościć powyższy kod, możemy zamienić wewnętrzną pętlę na System.arraycopy()jak w przypadku jednowymiarowej tablicy. Na przykład,

 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)); ) )

Wyjście :

 ((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))

Tutaj widzimy, że otrzymujemy ten sam wynik, zastępując wewnętrzną forpętlę arraycopy()metodą.

Interesujące artykuły...