Kaip įdiegti „Java“ seklią ir gilią kopiją

Šis straipsnis suteiks jums išsamių ir išsamių žinių apie „Java“ seklų ir gilųjį kopijavimą su pavyzdžiais.

Klonavimas yra kopijos ar kopijos kūrimo procesas objektas, klono metodas Java.lang.Object naudojamas sukurti objekto kopiją ar kopiją. „java“ objektai, diegiantys „Cloneable“ sąsają, gali naudoti klonavimo metodą. Šiame straipsnyje aptarsime „Seklią“ ir „Gilią kopiją“ šia tvarka:

„Java“ objekto kopijos kūrimas

Mes galime sukurti „Java“ objekto kopiją arba kopiją



1. Objekto kopijos kūrimas kitoje atminties vietoje. Tai vadinama gilia kopija.

kaip išeiti iš programos Java

2. Sukurkite naują nuorodą, nurodančią tą pačią atminties vietą. Tai taip pat vadinama seklia kopija.

Sekli kopija

Numatytasis klonų metodo įgyvendinimas sukuria negilų šaltinio objekto kopiją, tai reiškia, kad sukurtas naujas Object tipo egzempliorius, jis visus laukus nukopijuoja į naują egzempliorių ir grąžina naują „Object“ tipo objektą. Šiam objektui aiškiai turi būti priskirtas šaltinio objekto tipo objektas.

Šis objektas turės tikslią visų šaltinio objekto laukų, įskaitant primityvų tipą ir objektų nuorodas, kopijas. Jei šaltinio objekte yra kokių nors nuorodų į kitus lauko objektus, tai naujajame egzemplioriuje bus tik nuorodos į tuos objektus, tų objektų kopija nebus sukurta. Tai reiškia, kad jei mes padarysime pakeitimus seklioje kopijoje, pakeitimai atsispindės šaltinio objekte. Abi bylos nėra nepriklausomos.

„Object“ klasės klonų metodas yra saugomas gamtoje, todėl ne visos klasės gali naudoti „clone ()“ metodą. Turite įdiegti „Cloneable“ sąsają ir nepaisyti klonavimo metodo. Jei „Cloneable“ sąsaja nėra įdiegta, gausite CloneNotSupportedException.super.clone () grąžins negilų egzempliorių, kaip nurodyta „Object“ klasės įgyvendinime.

Seklios kopijos kodas

paketas com.test class Departamentas {String empId String grade Stygos žymėjimas public Department (String empId, String grade, Stygos žymėjimas) {this.empId = empId this.grade = grade this.designation = designation}} klasė Darbuotojai įgyvendina Cloneable {int id Eilutės pavadinimas Departamento skyriaus viešasis darbuotojas (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Numatytoji metodo „clone“ (versija) versija. Tai sukuria negilų objekto kopiją. apsaugotas objekto klonas () meta CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] argumentuoja) {Department dept1 = new Department ('1', 'A', 'AVP') darbuotojas emp1 = naujas darbuotojas (111, 'John', dept1) darbuotojas emp2 = null pabandykite {// sukurti emp1 kloną ir priskirti jį emp2 emp2 = (darbuotojas) emp1.clone ()} gaudyti (CloneNotSupportedException e) {e. printStackTrace ()} // „emp1“ pavadinimo spausdinimas System.out.println (emp1.dept.designation) // Išvestis: AVP // „emp2“ pavadinimo keitimas emp2.dept.designation = 'Director' // Šis pakeitimas atsispindės pradiniame darbuotojo „emp1“ System.out.println (emp1.dept.designation) // Output: Director}}

Išvestis:

Output-Shallow-Copy

c ++ rūšiavimo masyvai

Ankstesniame pavyzdyje mes turime „Employee class emp1“, kuriame yra trys klasės kintamojo ID (int), vardas (String) ir skyrius (Department).

Dabar klonavome „emp1“ į „emp2“, kad sukurtume negilų egzempliorių, po to pakeitėme žymėjimą naudodami „emp2“ objektą ir patikrinome, ar tie patys pakeitimai atsispindi ir emp1.


Gili kopija

Gilioje objekto kopijoje bus tiksli visų šaltinio objekto laukų, tokių kaip sekli kopija, kopija, tačiau, skirtingai nei blanki kopija, jei šaltinio objekte yra kokia nors nuoroda į objektą kaip laukus, tada objekto kopija sukuriama iškviečiant kloną metodas. Tai reiškia, kad tiek šaltinio, tiek paskirties objektai yra nepriklausomi vienas nuo kito. Bet koks klonuoto objekto pakeitimas neturės įtakos šaltinio objektui.

Gilios kopijos kodas

paketas com.test class Departamentas įgyvendina Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Numatytoji klono versija () metodas. apsaugotas objekto klonas () meta CloneNotSupportedException {return super.clone ()}} klasę Darbuotojas įgyvendina Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Nepaisomas klono () metodas, norint sukurti gilią objekto kopiją. apsaugotas objekto klonas () meta CloneNotSupportedException {Darbuotojo emp = (Darbuotojas) super.clone () emp.dept = (Departamentas) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Departamento dept1 = naujas skyrius ('1', 'A', 'AVP') Darbuotojo emp1 = naujas darbuotojas (111, 'John', dept1) Darbuotojo emp2 = niekinis bandymas {// Sukurti emp1 kloną ir priskirti jį emp2 emp2 = (Darbuotojas) emp1.clone ()} pagauti (CloneNotSupportedException e) {e.printStackTrace ()} // Spausdinant „emp1“ pavadinimą System.out.println (emp1.dept.designation) // Išvestis: AVP / / „Emp2“ pavadinimo keitimas emp2.dept.designation = 'Director' // Šis pakeitimas atsispindės pirminiame darbuotojo 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Išvestis:

Aukščiau pateiktame gilios kopijos pavyzdyje, skirtingai nei sekli kopija, tiek šaltinio, tiek paskirties objektai yra nepriklausomi vienas nuo kito. Bet koks „emp2“ pakeitimas neturės įtakos emp1.

Skirtumas tarp negilios ir gilios kopijos

Sekli kopija Gili kopija
Klonuotas objektas ir šaltinio objektas nėra visiškai atskirtiKlonuoti objektai ir šaltinio objektai yra visiškai nepriklausomi vienas nuo kito.
Klonuotame egzemplioriuje atlikti pakeitimai paveiks šaltinio objekto pamatinį kintamąjįKlonuotame egzemplioriuje atlikti pakeitimai neturės įtakos šaltinio objekto pamatiniam kintamajam.
Numatytoji klono versija yra sekli kopijaNorėdami sukurti gilią kopiją, turime nepaisyti objektų klasės klonų metodo.
Pirmenybė teikiama negiliai kopijuoti, jei objekto klasės kintamieji yra tik pirminio tipo laukaiGiluminė kopija yra pageidautina, jei objekto klasės kintamieji turi nuorodas į kitus objektus kaip laukus.
Tai gana greitaiTai gana lėta.

Tuo mes einame į „Shallow Copy and Deep Copy“ straipsnio pabaigą. Tikiuosi, kad supratote įvairius judviejų skirtumus.

transformacijos informatikoje su pavyzdžiu

Patikrinkite sukūrė „Edureka“ - patikima internetinė mokymosi įmonė, turinti daugiau nei 250 000 patenkintų besimokančiųjų tinklą. „Edureka“ mokymai ir sertifikavimo kursai „Java J2EE“ ir „SOA“ skirti studentams ir specialistams, norintiems būti „Java“ kūrėjais.

Turite mums klausimą? Prašau paminėti tai šio blogo komentarų skyriuje „Sekli kopija ir gili kopija“ ir mes kuo greičiau susisieksime su jumis.