Kuidas rakendada Java-s madalat ja sügavat kopeerimist



See artikkel annab üksikasjalikud ja põhjalikud teadmised Java-s madalast ja sügavast kopeerimisest koos näidetega.

Kloonimine on protsessi koopia või koopia loomine objekt, kloonimismeetod Java.lang.Objectit kasutatakse objekti koopia või koopia loomiseks. javaobjektid, mis rakendavad Cloneable liidest, sobivad kloonimismeetodi kasutamiseks. Selles artiklis käsitleme madalat ja sügavat kopeerimist järgmises järjekorras:

Java-objekti koopia loomine

Saame luua Java-objekti koopia või koopia





1. Objekti koopia loomine erinevast mälupunktist. Seda nimetatakse sügavaks koopiaks.

2. Uue viite loomine, mis osutab samale mälupunktile. Seda nimetatakse ka madalaks koopiaks.



Madal koopia

Kloonimeetodi vaikimisi juurutamine loob allikaobjekti madala koopia, see tähendab, et luuakse uus objekti tüüpi objekt, see kopeerib kõik väljad uuele eksemplarile ja tagastab uue objekti tüüpi Object. See objekt peab selgesõnaliselt olema lähteobjekti objektitüübi tüüp.

Sellel objektil on täpne koopia kõigist lähteobjekti väljadest, sealhulgas primitiivne tüüp ja objektiviited. Kui lähteobjekt sisaldab mingeid viiteid väli teistele objektidele, on uues eksemplaris ainult viited nendele objektidele, nende objektide koopiat ei looda. See tähendab, et kui teeme muudatusi madalas koopias, kajastuvad muudatused ka lähteobjektis. Mõlemad juhtumid ei ole sõltumatud.

Kloonimeetod klassis Object on looduses kaitstud, seega ei saa kõik klassid klooni () meetodit kasutada. Peate juurutama liidese Cloneable ja alistama kloonimismeetodi. Kui liidest Cloneable pole rakendatud, saate CloneNotSupportedException.super.clone () tagastab madala eksemplari vastavalt objektiklassi rakendusele.



Pinnakoopia kood

pakett com.test klass Osakond {String empId Stringi hinne Stringi tähistus avalik osakond (String empId, String hinne, Stringi tähistus) {this.empId = empId this.grade = hinne this.designation = designation}} klass Töötajate tööriistad Clonable {int id Stringi nimi Osakonna osakond avalik töötaja (int id, Stringi nimi, osakonna osakond) {this.id = id this.name = nimi this.dept = osakond} // Klooni () meetodi vaikeversioon. See loob objektist madala koopia. kaitstud objekti kloon () viskab CloneNotSupportedException {return super.clone ()}} avaliku klassi ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') töötaja emp1 = new Employee (111, 'John', dept1) Töötaja emp2 = null proovige {// Emp1 klooni loomine ja selle määramine emp2-le emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // 'emp1' tähise printimine System.out.println (emp1.dept.designation) // Output: AVP // 'emp2' nimetuse muutmine emp2.dept.designation = 'Director' // See muudatus kajastub algses töötaja 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Väljund:

Output-Shallow-Copy

Ülaltoodud näites on meil Employee class emp1, millel on kolm klassi muutuja id (int), nimi (String) ja osakond (Department).

teisenda Java-s topelt täisarvuks

Kloonisime nüüd emp1 emp2-sse, et luua madal koopia, pärast seda muutsime tähistust emp2 objekti abil ja kontrollisime, et samad muudatused kajastuksid ka emp1-s.


Sügav koopia

Objekti sügaval koopial on täpne koopia kõigist lähteobjekti väljadest nagu madal koopia, kuid erinevalt lahjast koopiast, kui lähteobjektil on viide objektile kui väljadele, luuakse kloonile helistades objekti koopia meetod. See tähendab, et nii lähte- kui ka sihtkoha objektid on üksteisest sõltumatud. Kloonitud objektis tehtud muudatused ei mõjuta lähteobjekti.

Sügava koopia kood

pakett com.test klass Osakond rakendab Cloneable {String empId String hinne Stringi tähistus avalik osakond (String empId, String hinne, stringi tähistus) {this.empId = empId this.grade = hinne this.designation = tähistus} // klooni vaikeversioon () meetod. kaitstud objekti kloon () viskab CloneNotSupportedException {return super.clone ()}} klass Töötaja rakendab Cloneable {int id Stringi nimi Osakonna osakond avalik töötaja (int id, Stringi nimi, osakonna osakond) {this.id = id this.name = nimi this.dept = dept} // Klooni () ülekandmine objekti sügava koopia loomiseks. kaitstud objekti kloon () viskab CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Osakonna osakond1 = uus osakond ('1', 'A', 'AVP') Töötaja emp1 = uus töötaja (111, 'John', osakond1) Töötaja emp2 = null proov {// emp1 klooni loomine ja selle määramine emp2-le emp2 = (töötaja) emp1.clone ()} saak (CloneNotSupportedException e) {e.printStackTrace ()} // tähise 'emp1' printimine System.out.println (emp1.dept.designation) // Väljund: AVP / / 'Emp2' nimetuse muutmine emp2.dept.designation = 'Director' // See muudatus kajastub algses töötaja 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Väljund:

Eespool toodud sügava koopia näites on erinevalt madalast koopiast nii lähte- kui ka sihtkoha objektid üksteisest sõltumatud. Kõik emp2-s tehtud muudatused ei mõjuta emp1-d.

Erinevus madala ja sügava koopia vahel

Madal koopia Sügav koopia
Kloonitud objekt ja lähteobjekt ei ole täielikult lahusKloonitud ja lähteobjektid on üksteisest täiesti sõltumatud.
Kloonitud eksemplaris tehtud muudatused mõjutavad lähteobjekti võrdlusmuutujatKloonitud eksemplaris tehtud muudatused ei mõjuta lähteobjekti võrdlusmuutujat.
Klooni vaikeversioon on madal koopiaSügava koopia loomiseks peame alistama klassi Object kloonimeetodi.
Eelistatakse madalat koopiat, kui objekti klassimuutujad on väljadena vaid primitiivsedEelistatakse sügavat koopiat, kui objekti klassi muutujatel on väljadena viiteid teistele objektidele.
See on suhteliselt kiireSee on suhteliselt aeglane.

Sellega jõuame artikli „Madal kopeerimine ja sügav koopia“ lõppu. Loodan, et saite aru nende kahe erinevusest.

Vaadake Edureka, usaldusväärne veebiõppeettevõte, mille võrgustik hõlmab üle 250 000 rahuloleva õppija, levinud üle kogu maailma. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud õpilastele ja spetsialistidele, kes soovivad olla Java arendajad.

Kas teil on meile küsimus? Palun mainige seda selle blogi „Pealispinna ja sügava koopia“ kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.