java copy array how copy clone an array java
Ta vadnica o kopiranju in kloniranju nizov razpravlja o različnih metodah za kopiranje matrike v Javi:
Tu bomo razpravljali o kopiranju Java-nizov. Java ponuja različne načine kopiranja elementov matrike. Kot vemo, lahko v Javi nizi vsebujejo elemente bodisi primitivnih tipov bodisi predmetov ali sklicev.
Med kopiranjem primitivnih vrst je naloga precej enostavna, ko pa gre za predmete ali reference, morate biti pozorni, ali je kopija globoka ali plitva.
=> Tukaj si oglejte Vodnik za začetnike Java.
Plitka kopija naredi kopijo elementa. Ko gre za primitivne tipe podatkov, ni problem. Ko pa gre za sklice, bo plitva kopija samo kopirala vrednost in ne osnovnih podatkov.
Kljub temu, da ste naredili kopije elementov, se bo sprememba ene kopije odrazila tudi v drugi kopiji, saj bodo mesta v pomnilniku v skupni rabi. Da bi to preprečili, morate poiskati globoko kopijo, v kateri mesta v pomnilniku niso v skupni rabi.
Kaj se boste naučili:
Kopiraj in kloniraj javanska polja
Java vam omogoča kopiranje nizov z uporabo metode neposrednega kopiranja, ki jo ponuja java.util ali sistemski razred. Zagotavlja tudi metodo kloniranja, ki se uporablja za kloniranje celotnega polja.
V tej vadnici bomo razpravljali o naslednjih metodah kopiranja in kloniranja nizov.
- Ročno kopiranje z uporabo zanke for
- Uporaba System.arraycopy ()
- Uporaba Arrays.copyOf ()
- Uporaba Arrays.copyOfRange ()
- Uporaba Object.clone ()
Raziskujmo !!
Ročno kopiranje z uporabo zanke
Ko kopiramo spremenljivke, na primer a in b, običajno izvedemo operacijo kopiranja, kot sledi:
a = b;
Če enako metodo uporabimo za nize, ne bo delovalo pravilno.
Poglejmo primer programiranja.
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 Izhod:
V zgornjem programu sta dve matriki, to sta intArray in copyArray. Naloga je kopiranje vsebine intArray v copyArray. V ta namen se uvede stavek copyArray = intArray. Tukaj se naredi, da so dodeljene reference niza. Zato to ni dejansko kopiranje.
Kot rezultat zgornje izjave si pomnilniško mesto intArray deli tudi copyArray. Zdaj, ko se element copyArray poveča, se ta sprememba odraža tudi v intArray. To je prikazano v izhodu.
Da bi odpravili to težavo, uporabimo metodo kopiranja polja z zanko for. Tu se vsak element izvirne matrike kopira v novo matriko z uporabo zanke for.
Ta program je prikazan spodaj.
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 Izhod:
Tu smo spremenili prejšnji program tako, da je vključil for zanko in znotraj zanke, vsak element intArray dodelimo ustreznemu elementu copyArray. Na ta način se elementi dejansko kopirajo. Torej, ko je eno polje spremenjeno, se spremembe ne odražajo v drugem polju.
Uporaba System.arraycopy ()
Javin sistemski razred ima metodo, imenovano 'ArrayCOpy', ki omogoča kopiranje elementov enega polja v drugo polje.
Splošni prototip te metode je naslednji:
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
Tukaj,
- src_array => Izvorno polje, od koder je treba kopirati vsebino.
- src_Pos => Položaj v izvorni matriki, od koder se začne kopiranje.
- dest_array => Ciljna matrika, v katero je treba kopirati elemente.
- dest_Pos => Začetni položaj v ciljni matriki za elemente, ki jih želite kopirati.
- dolžina => Dolžina polja, ki ga želite kopirati.
Razumimo to metodo s primerom.
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)); } }
Izhod:
V zgornjem programu uporabljamo metodo 'arraycopy' za kopiranje polja v drugo polje. Vidite lahko klic metode arraycopy. Izvorno matriko kopiramo od začetka (0thlocation) in kopirajte celotno matriko.
Na koncu prikažemo niz, enakovreden tako izvornim kot ciljnim nizom.
Z metodo arraycopy lahko kopirate celo delne nize, saj za argumente upošteva položaj začetnega in končnega elementa. Ta metoda naredi plitvo kopijo elementov matrike.
Uporaba Arrays.copyOf ()
Metoda Arrays.copyOf () interno uporablja metodo System.arraycopy (). Čeprav ni tako učinkovit kot arraycopy, se lahko uporablja za kopiranje celotnega ali delnega polja tako kot metoda arraycopy.
Metoda ‘copyOf ()’ je del paketa java.util in spada v razred »Arrays«.
Prototip te metode je naslednji:
public static int[] copyOf(int[] original_array,int newLength)
Kje,
- original: Polje, ki ga želite kopirati v novo polje.
- newLength: Dolžina kopirane matrike, ki jo je treba vrniti.
Tako ta metoda kopira matriko iz prvega argumenta na določeno dolžino tako, da dolžino skrajša ali dopolni z novo matriko. To pomeni, da če je dolžina kopiranega polja večja od prvotnega polja, se za preostale elemente zamenja 0.
Spodnji program prikazuje primer metode 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)); } }
Izhod:
V zgornjem programu kopiramo even_Array dolžine 4 z uporabo metode copyOf. Drugi podani argument je 5. Zato ima novo kopirano polje 5 elementov. Prvi štirje so enaki originalni matriki, peti element pa 0, saj jo copyOf doda, ker je dolžina prvotne matrice manjša od dolžine nove matrike.
Uporaba Arrays.copyOfRange ()
Metoda Arrays.copyOfRange () se posebej uporablja, če želite kopirati delne nize. Tako kot metoda copyOf (), tudi ta metoda interno uporablja metodo System.arraycopy ().
Prototip metode Arrays.copyOfRange () je naslednji:
public static short[] copyOfRange(short[] original, int from, int to)
kje,
- original: Matrika, iz katere je treba kopirati obseg.
- od: Začetni indeks obsega, ki ga je treba kopirati, vključno.
- do: Končni indeks obsega, ki ga želite kopirati, izključno.
Primer izvedbe metode copyOfRange je prikazan spodaj.
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)); } }
Izhod:
Uporaba Object.clone ()
Array Java interno implementira vmesnik Cloneable, zato je enoto Java enostavno klonirati. Lahko klonirate tako enodimenzionalne kot dvodimenzionalne nize. Ko klonirate enodimenzionalno polje, naredi globoko kopijo elementov polja, ki kopira vrednosti.
Po drugi strani pa, ko klonirate dvodimenzionalne ali večdimenzionalne nize, se naredi plitva kopija elementov, tj. Kopirajo se samo reference. To kloniranje nizov se izvede po metodi „Clone ()“, ki jo nudijo nizi.
Globoko kopijo 1-D nizov kot rezultat kloniranja lahko predstavimo kot spodaj:
Zdaj pa izvedimo kloniranje 1-D polja v programu 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 Kot lahko vidite v izhodu, izraz za preverjanje enakosti obeh nizov vrne false. To je zato, ker kloniranje enodimenzionalnega polja povzroči globoko kopiranje, pri čemer se vrednosti kopirajo v novo matriko in ne zgolj sklice.
Pogosto zastavljena vprašanja
V # 1) Kako narediti kopijo polja v Javi?
Odgovor: Obstajajo različne metode kopiranja matrike.
- Uporabite lahko zanko for in elemente enega v drugega kopirate enega za drugim.
- Za kloniranje polja uporabite metodo kloniranja.
- Uporabite metodo arraycopy () razreda System.
- Uporabite metode copyOf () ali copyOfRange () razreda Arrays.
V # 2) Kako dodelite eno polje drugemu?
Odgovor: Polje lahko dodelite drugemu s pomočjo preprostega operatorja dodelitve (=). Prepričati se morate, da sta polja enakega podatkovnega tipa in enake dimenzije.
V # 3) Kaj je plitka kopija in globoka kopija?
Odgovor: Pri plitvi kopiji se kopirajo samo atributi zadevnih predmetov ali nizov. Vse spremembe kopirane matrike se bodo torej odražale v izvirniku. Kloniranje Java je primer plitve kopije.
model življenjskega cikla v programskem inženirstvu
Globoka kopija je tista, pri kateri potrebujemo popolno kopijo predmeta, tako da je ta predmet, ko kloniramo ali kopiramo, neodvisna kopija. Ko gre za primitivne ali vgrajene vrste, ni razlike med plitvo in globoko kopijo.
V # 4) Kaj počne klon matrike?
Odgovor: Metoda kloniranja nizov se uporablja za kopiranje atributov enega predmeta v drugega. Za to uporablja plitvo kopijo.
V # 5) Ali lahko shranite matriko v matriko?
Odgovor: Polja lahko vsebujejo polja z elementi iste vrste (primitivni ali objektni). To pomeni, da v niz nizov ne morete shraniti celoštevilskega polja.
Zaključek
V tej vadnici smo v Javi raziskali nize kopij in kloniranje nizov. Videli smo različne metode / pristope za kopiranje in kloniranje polja.
Upoštevajte, da večina teh metod izvaja plitvo kopijo. Pri primitivnih vrstah podatkov se plitva in globoka kopija ne razlikuje. Ko pa matrika vsebuje predmete ali reference, mora programer izvajati globoko kopijo v skladu z zahtevami.
V naslednjih vajah še naprej raziskujemo več o nizih Java.
=> Preberite serijo Easy Java Training Series.
Priporočeno branje
- Vadnica za dolžino polja Java s primeri kode
- Java Generic Array - Kako simulirati generična polja v Javi?
- Java Array - Kako natisniti elemente polja v Javi?
- Večdimenzionalni nizi v Javi (2d in 3d nizi v Javi)
- Kako prenesti / vrniti polje v Javi
- Kako razvrstiti polje v Javi - Vadnica s primeri
- Java Array - prijavite, ustvarite in inicializirajte polje v Javi
- Odstrani / izbriši element iz polja v Javi