Šioje pamokoje sužinosite apie įvairius būdus, kaip galite naudoti, norėdami kopijuoti masyvus (tiek vieno, tiek dviejų matmenų) „Java“, naudodamiesi pavyzdžiais.
„Java“ sistemoje galime nukopijuoti vieną masyvą į kitą. Yra keletas būdų, kuriuos galite naudoti kopijuodami masyvus „Java“.
1. Masyvų kopijavimas naudojant „Assignment Operator“
Paimkime pavyzdį,
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 + ", "); ) ) )
Išvestis :
1, 2, 3, 4, 5, 6
Ankstesniame pavyzdyje mes naudojome priskyrimo operatorių ( =
), norėdami nukopijuoti masyvą, pavadintą numeriais, į kitą masyvą, pavadintą „teigiami numeriai“.
Ši technika yra lengviausia ir ji taip pat veikia. Tačiau yra šios technikos problema. Jei pakeisime vieno masyvo elementus, pasikeis ir kitų masyvų atitinkami elementai. Pavyzdžiui,
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 + ", "); ) ) )
Išvestis :
-1, 2, 3, 4, 5, 6
Čia galime pamatyti, kad pakeitėme vieną skaičių masyvo vertę. Kai atspausdiname masyvą teigiamąNumber, galime pamatyti, kad ta pati reikšmė taip pat yra pakeista.
Taip yra todėl, kad abu masyvai nurodo tą patį masyvo objektą. Taip yra dėl seklios kopijos. Norėdami sužinoti daugiau apie seklią kopiją, apsilankykite seklioje kopijoje.
Dabar, norint kurti naujus masyvo objektus kopijuojant masyvus, mums reikia gilios kopijos, o ne seklios kopijos.
2. Looping Construct naudojimas masyvams kopijuoti
Paimkime pavyzdį:
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)); ) )
Išvestis :
(1, 2, 3, 4, 5, 6)
Ankstesniame pavyzdyje mes naudojome for
kilpą, kad pakartotume kiekvieną šaltinio masyvo elementą. Kiekvienoje iteracijoje mes kopijuojame elementus iš šaltinio masyvo į paskirties masyvą.
Čia šaltinio ir paskirties masyvas nurodo skirtingus objektus (gilioji kopija). Taigi, jei keičiami vieno masyvo elementai, kito masyvo atitinkami elementai nepasikeičia.
Atkreipkite dėmesį į pareiškimą,
System.out.println(Arrays.toString(destination));
Čia metodas toString () naudojamas masyvui paversti eilute. Norėdami sužinoti daugiau, apsilankykite toString () metodą (oficiali „Java“ dokumentacija).
3. Masyvų kopijavimas naudojant arraycopy () metodą
„Java“ sistemoje klasėje yra metodas, pavadintas arraycopy()
masyvams kopijuoti. Šis metodas yra geresnis būdas kopijuoti masyvus nei minėti du.
Šis arraycopy()
metodas leidžia nukopijuoti nurodytą šaltinio masyvo dalį į paskirties masyvą. Pavyzdžiui,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Čia
- src - šaltinio masyvas, kurį norite nukopijuoti
- srcPos - pradinė pozicija (indeksas) šaltinio masyve
- paskirties - paskirties masyvas, kuriame elementai bus nukopijuoti iš šaltinio
- destPos - pradinė padėtis (indeksas) paskirties masyve
- length - kopijuojamų elementų skaičius
Paimkime pavyzdį:
// 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)); ) )
Išvestis :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
Ankstesniame pavyzdyje mes naudojome arraycopy()
metodą,
System.arraycopy(n1, 0, n2, 0, n1.length)
- visi n1 masyvo elementai nukopijuojami į n2 masyvąSystem.arraycopy(n1, 2, n3, 1, 2)
- 2 n1 masyvo elementai, pradedant nuo 2 indekso, nukopijuojami į indeksą pradedant nuo 1 iš n3 masyvo
Kaip matote, numatytoji pradinė int tipo masyvo elementų vertė yra 0.
4. Masyvų kopijavimas naudojant copyOfRange () metodą
We can also use the copyOfRange() method defined in Java Arrays class to copy arrays. For example,
// 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)); ) )
Output
destination1 = (2, 3, 12, 4, 12, -2) destination2 = (12, 4, 12)
In the above example, notice the line,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Here, we can see that we are creating the destination1 array and copying the source array to it at the same time. We are not creating the destination1 array before calling the copyOfRange()
method. To learn more about the method, visit Java copyOfRange.
5. Copying 2d Arrays Using Loop
Similar to the single-dimensional array, we can also copy the 2-dimensional array using the for
loop. For example,
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)); ) )
Output:
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
In the above program, notice the line,
System.out.println(Arrays.deepToString(destination);
Čia deepToString()
metodas naudojamas norint geriau parodyti 2 matmenų masyvą. Norėdami sužinoti daugiau, apsilankykite „Java deepToString“ ().
2d masyvų kopijavimas naudojant masyvo kopiją ()
Kad aukščiau pateiktas kodas būtų paprastesnis, mes galime pakeisti vidinę kilpą, System.arraycopy()
kaip ir vieno matmens masyvo atveju. Pavyzdžiui,
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)); ) )
Išvestis :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Čia galime pamatyti, kad tą patį išėjimą gauname pakeisdami vidinę for
kilpą arraycopy()
metodu.