java copy array how copy clone an array java
Acest tutorial privind copierea și clonarea matricilor discută diferitele metode de copiere a unui tablou în Java:
Aici vom discuta despre operația de copiere a matricelor Java. Java oferă diverse moduri în care puteți face copii ale elementelor matrice. După cum știm, în Java, tablourile pot conține elemente fie de tipuri primitive, fie obiecte sau referințe.
În timp ce realizați copii ale tipurilor primitive, sarcina este destul de ușoară, dar când vine vorba de obiecte sau referințe, trebuie să fiți atenți dacă copia este profundă sau superficială.
=> Consultați aici Ghidul pentru începători Java.
Copierea superficială face o copie a elementului. Nu este o problemă atunci când sunt implicate tipuri de date primitive. Dar atunci când sunt implicate referințe, o copie superficială va copia doar valoarea și nu informațiile de bază.
Astfel, chiar dacă ați făcut copii ale elementelor, o modificare într-o copie se va reflecta și în altă copie, pe măsură ce locațiile memoriei sunt partajate. Pentru a preveni acest lucru, trebuie să alegeți o copie profundă în care locațiile de memorie nu sunt partajate.
Ce veți învăța:
Copiați și clonați matricele Java
Java vă permite să copiați tablouri utilizând fie metoda de copiere directă furnizată de java.util, fie de clasa System. De asemenea, oferă o metodă de clonare care este utilizată pentru a clona o întreagă matrice.
În acest tutorial, vom discuta despre următoarele metode de copiere și clonare a matricelor.
- Copiere manuală folosind bucla for
- Utilizarea System.arraycopy ()
- Utilizarea Arrays.copyOf ()
- Utilizarea Arrays.copyOfRange ()
- Utilizarea Object.clone ()
Să explorăm !!
Copierea manuală utilizând pentru buclă
În mod normal, atunci când copiem variabile, de exemplu, a și b, efectuăm operația de copiere după cum urmează:
a = b;
Nu va funcționa corect dacă aplicăm aceeași metodă matricelor.
Să vedem un exemplu de programare.
public class Main { public static void main(String() args) { int intArray() = {12,15,17}; //print original intArray System.out.println('Contents of intArray() before assignment:'); for (int i=0; i Ieșire:
În programul de mai sus, există două matrice, adică intArray și copyArray. Sarcina este de a copia conținutul intArray în copyArray. Pentru a face acest lucru, este introdusă declarația copyArray = intArray. Ceea ce se face aici este că sunt atribuite referințele matricei. Prin urmare, aceasta nu este o copiere efectivă.
Ca urmare a declarației de mai sus, locația de memorie a intArray este partajată și de copyArray. Acum, când elementul copyArray este incrementat, această modificare se reflectă și în intArray. Acest lucru este afișat în ieșire.
Pentru a depăși această problemă, folosim o metodă de copiere a matricei folosind bucla for. Aici, fiecare element al matricei originale este copiat în matricea nouă folosind o buclă for.
Acest program este prezentat mai jos.
public class Main { public static void main(String() args) { int intArray() = {12,15, 17}; // define an array copyArray to copy contents of intArray int copyArray() = new int(intArray.length); // copy contents of intArray to copyArray for (int i=0; i Ieșire:
Aici am modificat programul anterior pentru a include pentru buclă și în interior pentru buclă, atribuim fiecare element al intArray elementului corespunzător al copyArray. În acest fel, elementele sunt copiate de fapt. Deci, atunci când o matrice este modificată, modificările nu se reflectă într-o altă matrice.
Utilizarea System.arraycopy ()
Clasa de sistem Java are o metodă numită „ArrayCOpy” care vă permite să copiați elemente dintr-o matrice în alta matrice.
Prototipul general al acestei metode este următorul:
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
Aici,
- src_array => Matrice sursă de unde urmează să fie copiat conținutul.
- src_Pos => Poziția din matricea sursă de unde va începe copierea.
- dest_array => Matrice de destinație la care elementele urmează să fie copiate.
- dest_Pos => Poziția inițială în matricea de destinație pentru elementele de copiat.
- lungime => Lungimea matricei de copiat.
Să înțelegem această metodă cu un exemplu.
class Main { public static void main(String() args) { //declaring a source array char() src_array = { 'S','o','f','t','w','a','r','e','T','e','s','t','i','n','g','H','e','l','p'}; char() dest_array = new char(19); System.arraycopy(src_array, 0, dest_array, 0,19); System.out.println('Source array:' + String.valueOf(src_array)); System.out.println('Destination array after arraycopy:'+ String.valueOf(dest_array)); } }
Ieșire:
În programul de mai sus, folosim metoda „arraycopy” pentru a copia o matrice într-o altă matrice. Puteți vedea apelul la metoda de copiere. Copiem matricea sursă de la început (0alocație) și copiați întreaga matrice.
În cele din urmă, afișăm echivalentul șirului atât al surselor, cât și al matricelor de destinație.
Cu metoda arraycopy, puteți copia chiar matricele parțiale, deoarece ia pozițiile elementului de început și de sfârșit ca argumente. Această metodă face o copie superficială a elementelor matrice.
Utilizarea Arrays.copyOf ()
Metoda Arrays.copyOf () utilizează intern metoda System.arraycopy (). Deși nu este la fel de eficientă ca aracopia, poate fi utilizată pentru a copia o matrice completă sau parțială la fel ca metoda aracopiei.
Metoda ‘copyOf ()’ face parte din pachetul java.util și aparține clasei „Arrays”.
Prototipul acestei metode este după cum urmează:
public static int() copyOf(int() original_array,int newLength)
Unde,
- original: Matricea care trebuie copiată în noua matrice.
- lungime nouă: Lungimea matricei copiate care trebuie returnată.
Astfel, această metodă face o copie a matricei furnizate în primul argument la lungimea specificată prin trunchierea sau umplerea lungimii cu 0 la noua matrice. Aceasta înseamnă că dacă lungimea matricei copiate este mai mare decât matricea originală, 0s sunt înlocuite pentru elementele rămase.
Programul prezentat mai jos prezintă un exemplu al metodei copyOf.
importjava.util.Arrays; public class Main { public static void main(String args()) { // define original array int() even_Array = new int() {2,4,6,8}; System.out.println('Original Array:' + Arrays.toString(even_Array)); // copying array even_Array to copy_Array int() copy_Array = Arrays.copyOf(even_Array,5); System.out.println('Copied Array:' + Arrays.toString(copy_Array)); // assign value to unassigned element of copied array copy_Array(4) = 10; System.out.println('Copied and modified Array:' + Arrays.toString(copy_Array)); } }
Ieșire:
În programul de mai sus, copiem even_Array de lungimea 4 folosind metoda copyOf. Al doilea argument furnizat este 5. Prin urmare, noua matrice copiată conține 5 elemente. Primele patru sunt la fel ca matricea originală, iar al cincilea element este 0, deoarece copyOf îl tamponează, deoarece lungimea matricei originale este mai mică decât cea a matricei noi.
Utilizarea Arrays.copyOfRange ()
Metoda Arrays.copyOfRange () este utilizată în mod special atunci când doriți să copiați tablouri parțiale. La fel ca metoda copyOf (), această metodă utilizează și intern metoda System.arraycopy ().
Prototipul metodei Arrays.copyOfRange () este după cum urmează:
public static short() copyOfRange(short() original, int from, int to)
Unde,
- original: Matricea din care urmează să fie copiat un interval.
- din: Indexul inițial al intervalului de copiat, inclusiv.
- la: Indicele final al gamei de copiat, exclusiv.
Un exemplu de implementare a metodei copyOfRange este prezentat mai jos.
import java.util.Arrays; class Main { public static void main(String args()) { int intArray() = { 10,20,30,40,50 }; // to index is within the range int() copyArray = Arrays.copyOfRange(intArray, 2, 6); System.out.println('Array copy with both index within the range: ' + Arrays.toString(copyArray)); //to index is out of range int() copy1 = Arrays.copyOfRange(intArray, 4, intArray.length + 3); System.out.println('Array copy with to index out of range: ' + Arrays.toString(copy1)); } }
Ieșire:
Utilizarea Object.clone ()
Matricea Java implementează intern o interfață clonabilă și, prin urmare, este ușor să clonați o matrice Java. Puteți clona matrici unidimensionale și bidimensionale. Când clonați o matrică unidimensională, aceasta face o copie profundă a elementelor matricei care copiază valorile.
Pe de altă parte, atunci când clonați tablouri bidimensionale sau multidimensionale, se face o copie superficială a elementelor, adică sunt copiate numai referințele. Această clonare a matricelor se realizează prin metoda „Clonare ()” furnizată de matrice.
O copie profundă a matricelor 1-D ca rezultat al clonării poate fi reprezentată după cum urmează:
Acum să implementăm clonarea matricei 1-D într-un program Java.
class Main { public static void main(String args()) { int num_Array() = {5,10,15,20,25,30}; int clone_Array() = num_Array.clone(); System.out.println('Original num_Array:'); for (int i = 0; i După cum puteți vedea în ieșire, expresia pentru a verifica egalitatea ambelor matrice returnează fals. Acest lucru se datorează faptului că clonarea matricei unidimensionale are ca rezultat o copiere profundă în care valorile sunt copiate într-o matrice nouă și nu doar referințe.
întrebări frecvente
Q # 1) Cum se face o copie a unui tablou în Java?
Răspuns: Există diferite metode pentru a copia o matrice.
- Puteți utiliza o buclă for și puteți copia elemente de la unul la altul unul câte unul.
- Utilizați metoda clonării pentru a clona o matrice.
- Folosiți metoda arraycopy () din clasa System.
- Utilizați metodele copyOf () sau copyOfRange () din clasa Arrays.
Q # 2) Cum atribuiți o matrice alteia?
Răspuns: Puteți atribui tabloul altui utilizând un simplu operator de atribuire (=). Trebuie să vă asigurați că cele două matrice sunt de același tip de date și au o dimensiune identică.
Î # 3) Ce este o copie superficială și o copie profundă?
Răspuns: În copierea superficială, numai atributele obiectelor sau matricelor în cauză sunt copiate. Deci, orice modificare a matricei copiate se va reflecta în original. Clonarea Java este un exemplu de copie superficială.
care este cel mai bun convertor video pe YouTube
O copie profundă este cea în care avem nevoie de o copie completă a obiectului, astfel încât atunci când clonăm sau copiem acel obiect, acesta să fie o copie independentă. Atunci când sunt implicate tipuri primitive sau încorporate, nu există nicio diferență între copia superficială și cea profundă.
Î # 4) Ce face o clonă de matrice?
Răspuns: Metoda de clonare a matricelor este utilizată pentru a copia atributele unui obiect la altul. Folosește o copie superficială pentru a face acest lucru.
Q # 5) Puteți stoca o matrice într-o matrice?
Răspuns: Tablourile pot conține tablouri furnizate cu elementele care sunt de același tip (primitiv sau obiect). Aceasta înseamnă că nu puteți stoca o matrice întreagă într-o matrice de șiruri.
Concluzie
În acest tutorial, am explorat matricea de copiere și matricele de clone în Java. Am văzut diverse metode / abordări pentru a copia și clona o matrice.
Rețineți că majoritatea acestor metode implementează o copie superficială. Pentru tipurile de date primitive, copierea superficială și profundă nu diferă. Dar când un tablou conține obiecte sau referințe, programatorul trebuie să implementeze o copie profundă conform cerințelor.
În tutorialele noastre ulterioare, continuăm să explorăm mai multe despre matricile Java.
=> Citiți seria Easy Training Java.
Lectură recomandată
- Tutorial Java Array Length cu exemple de cod
- Java Generic Array - Cum se pot simula matrici generice în Java?
- Java Array - Cum se imprimă elemente ale unui array în Java?
- Matrice multidimensionale în Java (matrice 2d și 3d în Java)
- Cum să treceți / returnați o matrice în Java
- Cum să sortați o matrice în Java - Tutorial cu exemple
- Java Array - Declarați, creați și inițializați o matrice în Java
- Eliminați / ștergeți un element dintr-o matrice în Java