Kuinka toteuttaa matala kopiointi ja syvä kopiointi Java-sovelluksessa



Tämä artikkeli antaa sinulle yksityiskohtaisen ja kattavan tietämyksen matalasta kopiosta ja syväkopioinnista Javalla esimerkkien avulla.

Kloonaus on prosessi, jolla luodaan kopio tai kopio objekti, kloonimenetelmä Java.lang.Object käytetään objektin kopion tai kopion luomiseen. java-objektit, jotka toteuttavat Cloneable-käyttöliittymän, voivat käyttää kloonausmenetelmää. Tässä artikkelissa keskustellaan matalasta kopiosta ja syväkopioinnista seuraavassa järjestyksessä:

Java-objektin kopion luominen

Voimme luoda kopion tai kopion Java-objektista





1. Luo kopio objektista eri muistipaikkaan. Tätä kutsutaan Deep-kopioksi.

sql-palvelinopastus aloittelijoille

2. Luodaan uusi viite, joka osoittaa samaan muistipaikkaan. Tätä kutsutaan myös matalaksi kopioksi.



Matala kopio

Kloonimenetelmän oletusarvoinen toteutus luo matalan kopion lähdeobjektista, se tarkoittaa, että luodaan uusi Object-tyyppinen ilmentymä, se kopioi kaikki kentät uuteen ilmentymään ja palauttaa uuden objektityypin ”Object”. Tämän objektin on nimenomaisesti oltava tyypiltään lähdeobjektin objektityyppi.

Tällä objektilla on tarkka kopio kaikista lähdeobjektin kentistä, mukaan lukien primitiivinen tyyppi ja objektiviitteet. Jos lähdeobjekti sisältää viittauksia muihin kentän objekteihin, uudessa ilmentymässä on vain viittauksia näihin objekteihin, kopiota näistä objekteista ei luoda. Tämä tarkoittaa, että jos teemme muutoksia matalaan kopioon, muutokset heijastuvat lähdeobjektiin. Molemmat tapaukset eivät ole riippumattomia.

Object-luokan kloonimenetelmä on luonnossa suojattu, joten kaikki luokat eivät voi käyttää clone () -menetelmää. Sinun on toteutettava Cloneable-käyttöliittymä ja ohitettava kloonausmenetelmä. Jos Cloneable-käyttöliittymää ei ole otettu käyttöön, saat CloneNotSupportedException.super.clone () palauttaa matalan kopion Object-luokan toteutuksen mukaisesti.



Koodi matalalle kopiolle

paketti com.test class Osasto {String empId String grade String nimitys julkinen osasto (String empId, String grade, String name) {this.empId = empId this.grade = arvosana this.designation = designation}} luokka Työntekijän työkalut Cloneable {int id Merkkijonon nimi Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Clone () -menetelmän oletusversio. Se luo matalan kopion esineestä. suojattu objektiklooni () heittää CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] argumentit) {Department dept1 = new Department ('1', 'A', 'AVP') Työntekijä emp1 = uusi työntekijä (111, 'John', osasto1) työntekijä emp2 = tyhjä yritä {// luoda emp1-klooni ja määrittää se emp2: lle emp2 = (työntekijä) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // 'emp1' -merkinnän tulostus System.out.println (emp1.dept.designation) // Output: AVP // 'emp2' -merkinnän muuttaminen emp2.dept.designation = 'Director' // Tämä muutos näkyy alkuperäisessä työntekijän 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Tuotos:

Output-Shallow-Copy

mikä on sqoop hadoopissa

Yllä olevassa esimerkissä meillä on Employee class emp1, jolla on kolme luokan muuttujan id (int), nimi (String) ja osasto (Department).

Kloonasimme emp1: n emp2: een muodostaaksemme matalan kopion, sen jälkeen muutimme nimitystä emp2-objektilla ja varmistimme, että samat muutokset heijastuvat myös emp1: een.


Syvä kopio

Objektin syväkopiossa on tarkka kopio kaikista lähdeobjektin kentistä, kuten matala kopio, mutta toisin kuin sileä kopio, jos lähdeobjektilla on viittaus objektiin kenttinä, objektin kopio luodaan kutsumalla klooni menetelmä. Tämä tarkoittaa, että sekä lähde- että kohdeobjektit ovat toisistaan ​​riippumattomia. Kloonattuun objektiin tehdyt muutokset eivät vaikuta lähdeobjektiin.

Syväkopioinnin koodi

package com.test class Osasto toteuttaa Cloneable {String empId String grade String nimitys julkinen osasto (String empId, String grade, String nimitys) {this.empId = empId this.grade = grade this.designation = designation} // Kloonin oletusversio () menetelmä. suojattu Object-klooni () heittää CloneNotSupportedException {return super.clone ()}} -luokan Työntekijän toteutus Cloneable {int id String name Osaston osasto public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Clone () -menetelmän korvaaminen objektin syväkopion luomiseksi. suojattu objektiklooni () heittää CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Osaston osasto1 = uusi osasto ('1', 'A', 'AVP') Työntekijän emp1 = uusi työntekijä (111, 'John', osasto1) Työntekijän emp2 = tyhjä yritys {// Luo emp1: n klooni ja määritetään se emp2: lle emp2 = (Työntekijä) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Merkinnän tulostaminen 'emp1' System.out.println (emp1.dept.designation) // Lähtö: AVP / / 'Emp2' -nimityksen muuttaminen emp2.dept.designation = 'Director' // Tämä muutos näkyy alkuperäisessä työntekijän 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Tuotos:

Edellä olevassa Deep copy -esimerkissä, toisin kuin matala kopiointi, sekä lähde- että kohdeobjektit ovat toisistaan ​​riippumattomia. Emp2: ssä tehdyt muutokset eivät vaikuta emp1: een.

Ero matalan kopion ja syväkopioinnin välillä

Matala kopio Syvä kopio
Kloonattu objekti ja lähdeobjekti eivät ole täysin erillään toisistaanKloonatut ja lähdeobjektit ovat täysin toisistaan ​​riippumattomia.
Kloonatussa instanssissa tehdyt muutokset vaikuttavat lähdeobjektin viitemuuttujaanKloonatussa instanssissa tehdyt muutokset eivät vaikuta lähdeobjektin viitemuuttujaan.
Kloonin oletusversio on matala kopioSyväkopion luomiseksi meidän on korvattava Object-luokan kloonimenetelmä.
Pieni kopio on suositeltava, jos objektin luokkamuuttujat ovat vain primitiivisiä tyyppejä kenttinäSyvä kopio on suositeltava, jos objektin luokan muuttujilla on viittauksia muihin objekteihin kentinä.
Se on suhteellisen nopeaSe on suhteellisen hidasta.

Tämän avulla olemme päässeet Shallow Copy and Deep Copy -artikkelin loppuun. Toivon, että sait käsityksen näiden kahden erilaisista eroista.

tulosta_r merkkijonoon

Katso Edureka, luotettava verkko-oppimisyritys, jolla on yli 250 000 tyytyväisen oppijan verkosto, joka levisi ympäri maailmaa. Edurekan Java J2EE- ja SOA-koulutus- ja sertifiointikurssi on suunniteltu opiskelijoille ja ammattilaisille, jotka haluavat olla Java-kehittäjiä.

Onko sinulla kysymys meille? Mainitse se tämän 'Shallow Copy and Deep Copy' -blogin kommenttiosassa, niin otamme sinuun yhteyttä mahdollisimman pian.