Având în vedere o matrice, trebuie să îi copiem elementele într-o matrice diferită, unui utilizator naiv, ne vine în minte felul de mai jos, care este totuși incorect, după cum este descris mai jos, după cum urmează:
// 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;> Ieșire:

Ieșire Explicație: Când facem b = a, de fapt atribuim o referință matricei. Prin urmare, dacă facem vreo modificare la o matrice, aceasta ar fi reflectată și în alte matrice, deoarece atât a cât și b se referă la aceeași locație. De asemenea, îl putem verifica cu codul, după cum se arată mai jos, după cum urmează:
Exemplu:
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] + ' '); } }> |
>
>Ieșire
Contents of a[] 2 8 3 Contents of b[] 2 8 3>
Metode:
Am văzut funcționarea internă în timpul copierii elementelor și a cazurilor marginale care trebuie luate în considerare după trecerea erorilor generate de mai sus, așa că acum putem propune modalități corecte de a copia matricea, după cum urmează, după cum urmează:
- Iterarea fiecărui element din matricea originală dată și copierea câte un element
- Folosind metoda clone().
- Folosind metoda arraycopy().
- Folosind metoda copyOf() din clasa Arrays
- Folosind metoda copyOfRange() din clasa Arrays
Metoda 1: Iterarea fiecărui element din matricea originală dată și copierea câte un element. Prin utilizarea acestei metode, se garantează că orice modificări aduse b, nu vor modifica matricea originală a, așa cum se arată în exemplul de mai jos, după cum urmează:
Exemplu:
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] + ' '); } }> |
>
>Ieșire
tipuri de testare software
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 2: Folosind metoda Clone().
În metoda anterioară, a trebuit să repetăm întreaga matrice pentru a face o copie, putem face mai bine? Da, putem folosi metoda clonării în Java.
Exemplu:
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] + ' '); } }> |
>
>Ieșire
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 3: Folosind metoda arraycopy().
Putem folosi, de asemenea System.arraycopy() Metodă. Sistemul este prezent în pachetul java.lang. Semnătura sa este ca:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)>
Parametri:
- src denotă matricea sursă.
- srcPos este indexul de la care începe copierea.
- start denotă matricea de destinație
- destPos este indexul din care sunt plasate elementele copiate în tabloul de destinație.
- lungime este lungimea subbaryului de copiat.
Exemplu:
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] + ' '); } }> |
>
>Ieșire
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 4: Folosind metoda copyOf() din clasa Arrays
Dacă dorim să copiem primele câteva elemente ale unui tablou sau o copie completă a matricei, puteți folosi această metodă.
Sintaxă:
public static int[] copyOf?(int[] original, int newLength)>
Parametri:
- Matrice originală
- Lungimea matricei de copiat.
Exemplu:
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] + ' '); } }> |
>
testarea software-ului și tipurile
>Ieșire
Contents of a[] 1 8 3 Contents of b[] 2 8 3>
Metoda 5: Folosind metoda copyOfRange() din clasa Arrays
Această metodă copiază intervalul specificat al matricei specificate într-o matrice nouă.
public static int[] copyOfRange?(int[] original, int from, int to)>
Parametri:
- Matrice originală din care urmează să fie copiat un interval
- Indexul inițial al intervalului de copiat
- Indexul final al intervalului de copiat, exclusiv
Exemplu:
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] + ' '); } }> |
>
>Ieșire
Contents of a[] 1 8 3 5 9 10 Contents of b[] 3 5 9 10>
În cele din urmă, să discutăm despre prezentare generală a metodelor de mai sus:
- Pur și simplu atribuirea referințelor este greșită
- Matricea poate fi copiată prin iterarea peste o matrice și alocarea elementelor unul câte unul.
- Putem evita iterația asupra elementelor folosind clone() sau System.arraycopy()
- clone() creează o nouă matrice de aceeași dimensiune, dar System.arraycopy() poate fi folosit pentru a copia dintr-un interval sursă într-un interval de destinație.
- System.arraycopy() este mai rapid decât clone() deoarece folosește Java Native Interface
- Dacă doriți să copiați primele câteva elemente ale unui tablou sau o copie completă a unei matrice, puteți utiliza metoda Arrays.copyOf().
- Arrays.copyOfRange() este folosit pentru a copia un interval specificat al unui tablou. Dacă indexul de pornire nu este 0, puteți utiliza această metodă pentru a copia o matrice parțială.