Како применити плитко копирање и дубоко копирање на Јави



Овај чланак ће вам пружити детаљно и свеобухватно знање о плитком копирању и дубоком копирању у Јави са примерима.

Клонирање је поступак стварања реплике или копије објект, метода клона Јава.ланг.Објецт користи се за креирање копије или реплике објекта. јава објекти који имплементирају Цлонеабле интерфејс испуњавају услове за употребу методе клонирања. У овом чланку ћемо разговарати о плиткој копији и дубокој копији следећим редоследом:

Стварање копије Јава објекта

Можемо створити реплику или копију Јава објекта до





шта је подниз у јави

1. Стварање копије објекта на другој меморијској локацији. Ово се назива дубока копија.

2. Стварање нове референце која упућује на исту меморијску локацију. Ово се назива и плитка копија.



Схаллов Цопи

Подразумевана имплементација методе клонирања ствара плитку копију изворног објекта, то значи да се креира нова инстанца типа Објецт, копира сва поља у нову инстанцу и враћа нови објекат типа ‘Објецт’. Овај објект мора изричито бити укуцан у типу објекта изворног објекта.

Овај објекат ће имати тачну копију свих поља изворног објекта, укључујући примитивни тип и референце објекта. Ако изворни објекат садржи било какве референце на друге објекте у пољу, тада ће у новој инстанци имати само референце на те објекте, копија тих објеката се не креира. То значи да ако направимо промене у плиткој копији, промене ће се одразити на изворном објекту. Обе инстанце нису независне.

Метода клонирања у класи Објект заштићена је у природи, па не могу све класе користити методу клонирања (). Морате да примените Цлонеабле интерфејс и замените метод клонирања. Ако Цлонеабле интерфејс није имплементиран, добићете ЦлонеНотСуппортедЕкцептион.супер.цлоне () ће вратити плитку копију према имплементацији у класи Објецт.



Шифра за плитку копију

пакет цом.тест класа Одељење {Стринг емпИд Стринг оцена Ознака низа публиц Департмент (Стринг емпИд, Стринг граде, Стринг одредница) {тхис.емпИд = емпИд тхис.граде = граде тхис.десигнатион = десигнатион}} класа Запослени примењује Цлонеабле {инт ид Назив низа Одељење јавно Запослени (инт ид, Назив низа, Одељење одељења) {тхис.ид = ид тхис.наме = наме тхис.депт = депт} // Подразумевана верзија методе цлоне (). Ствара плитку копију објекта. клон заштићеног објекта () баца ЦлонеНотСуппортедЕкцептион {ретурн супер.цлоне ()}} јавна класа СхалловЦопиИнЈава {публиц статиц воид маин (Стринг [] аргс) {Департмент депт1 = нев Департмент ('1', 'А', 'АВП') Емплоиее емп1 = нови запослени (111, 'Јохн', депт1) Запослени емп2 = нулл три {// Стварање клона емп1 и његово додељивање емп2 емп2 = (запослени) емп1.цлоне ()} цатцх (ЦлонеНотСуппортедЕкцептион е) {е. принтСтацкТраце ()} // Штампање ознаке 'емп1' Систем.оут.принтлн (емп1.депт.десигнатион) // Излаз: АВП // Промена ознаке 'емп2' емп2.депт.десигнатион = 'Дирецтор' // Ова промена ће се одразити на оригиналном запосленом 'емп1' Систем.оут.принтлн (емп1.депт.десигнатион) // Резултат: Дирецтор}}

Излаз:

Output-Shallow-Copy

авс покреће инстанцу из снимка

У горњем примеру имамо класу Емплоиее емп1 која има три променљиве класе ид (инт), име (Стринг) и одељење (Департмент).

Сада смо клонирали емп1 у емп2 да бисмо створили плитку копију, након чега смо променили ознаку помоћу објекта емп2 и проверили да ли су се исте промене одразиле и на емп1.


Дееп Цопи

Дубинска копија објекта имат ће тачну копију свих поља изворног објекта попут плитке копије, али за разлику од саллов копије ако изворни објект има било какву референцу на објект као поља, тада се реплика објекта креира позивањем клона метода. То значи да су и изворни и одредишни објекти независни једни од других. Свака промена извршена у клонираном објекту неће утицати на изворни објекат.

Шифра за дубоку копију

пакет цом.тест цласс Одељење имплементира Цлонеабле {Стринг емпИд Стринг граде Ознака низа публиц департмент (Стринг емпИд, Стринг граде, Стринг одредница) {тхис.емпИд = емпИд тхис.граде = граде тхис.десигнатион = одредница} // Подразумевана верзија клона () метода. заштићени објекат цлоне () баца ЦлонеНотСуппортедЕкцептион {ретурн супер.цлоне ()}} класа Запослени имплементира Цлонеабле {инт ид Име низа Одељење јавно Запослени (инт ид, Име низа, одељење одељења) {тхис.ид = ид тхис.наме = наме тхис.депт = депт} // Замена методе цлоне () за стварање дубинске копије објекта. заштићени клон објекта () баца ЦлонеНотСуппортедЕкцептион {Запослени емп = (Запослени) супер.цлоне () емп.депт = (Одељење) депт.цлоне () ретурн емп}} јавна класа ДеепЦопиИнЈава {јавна статичка воид главна (Стринг [] аргс) { Одељење депт1 = ново Одељење ('1', 'А', 'АВП') Запослени емп1 = нови запослени (111, 'Јохн', депт1) Запослени емп2 = нулл три {// Стварање клона емп1 и његово додељивање емп2 емп2 = (Запослени) емп1.цлоне ()} цатцх (ЦлонеНотСуппортедЕкцептион е) {е.принтСтацкТраце ()} // Штампање ознаке 'емп1' Систем.оут.принтлн (емп1.депт.десигнатион) // Излаз: АВП / / Промена ознаке 'емп2' емп2.депт.десигнатион = 'Дирецтор' // Ова промена ће се одразити на изворном запосленом 'емп1' Систем.оут.принтлн (емп1.депт.десигнатион) // Излаз: АВП}}

Излаз:

У горњем примеру дубоке копије, за разлику од плитке копије, објекти извора и одредишта независни су једни од других. Свака промена извршена у емп2 неће утицати на емп1.

Разлика између плитке и дубоке копије

Схаллов Цопи Дееп Цопи
Клонирани објекат и изворни објекат нису у потпуности раздвојениКлонирани објекти и изворни објекти потпуно су независни једни од других.
Промене извршене у клонираној инстанци утицаће на референтну променљиву изворног објектаПромене извршене у клонираној инстанци неће утицати на референтну променљиву изворног објекта.
Подразумевана верзија клона је плитка копијаДа бисмо креирали дубоку копију, морамо да заменимо методу клонирања класе Објецт.
Плитка копија је пожељна ако су променљиве класе објекта само примитивни тип као пољаДубинска копија је пожељна ако променљиве класе објекта имају референце на друге објекте као поља.
То је релативно брзоРелативно је споро.

Овим смо дошли до краја чланка о Плитком копирању и Дубинском копирању. Надам се да сте разумели разне разлике између њих двоје.

принт_р у низ

Погледајте Едурека, поуздана компанија за учење на мрежи са мрежом од више од 250 000 задовољних ученика раширених широм света. Едурекин курс за обуку и сертификацију Јава Ј2ЕЕ и СОА дизајниран је за студенте и професионалце који желе да буду Јава програмер.

Имате питање за нас? Молимо вас да га спомињете у одељку за коментаре овог блога „Плитко копирање и дубоко копирање“ и јавићемо вам се што је пре могуће.