Java में Shallow Copy और Deep Copy कैसे लागू करें



यह लेख आपको उदाहरणों के साथ जावा में शाओलो कॉपी और डीप कॉपी का विस्तृत और व्यापक ज्ञान प्रदान करेगा।

क्लोनिंग एक प्रतिकृति या प्रतिलिपि बनाने की एक प्रक्रिया है ऑब्जेक्ट, क्लोन विधि Java.lang.Object का उपयोग किसी ऑब्जेक्ट की कॉपी या प्रतिकृति बनाने के लिए किया जाता है। जावा ऑब्जेक्ट जो क्लोन करने योग्य इंटरफ़ेस को लागू करते हैं, क्लोन विधि का उपयोग करने के लिए योग्य हैं। इस लेख में, हम निम्नलिखित क्रम में शाओलो कॉपी और डीप कॉपी पर चर्चा करेंगे:

जावा ऑब्जेक्ट की कॉपी बनाना

हम जावा ऑब्जेक्ट की प्रतिकृति या कॉपी बना सकते हैं





1. एक अलग मेमोरी लोकेशन में ऑब्जेक्ट की कॉपी बनाना। इसे डीप कॉपी कहते हैं।

2. एक नया संदर्भ बनाना जो एक ही मेमोरी लोकेशन की ओर इशारा करता है। इसे शॉल कॉपी भी कहा जाता है।



उथली प्रतिलिपि

क्लोन पद्धति का डिफ़ॉल्ट कार्यान्वयन स्रोत ऑब्जेक्ट की एक उथली प्रतिलिपि बनाता है, इसका मतलब है कि प्रकार की एक नई आवृत्ति बनाई गई है, यह सभी फ़ील्ड को एक नए इंस्टेंस पर कॉपी करता है और टाइप 'ऑब्जेक्ट' की एक नई ऑब्जेक्ट देता है। यह ऑब्जेक्ट स्पष्ट रूप से ऑब्जेक्ट प्रकार के स्रोत ऑब्जेक्ट में टाइपकास्ट होने की आवश्यकता है।

इस ऑब्जेक्ट में आदिम प्रकार और ऑब्जेक्ट संदर्भ सहित स्रोत ऑब्जेक्ट के सभी क्षेत्रों की एक सटीक प्रतिलिपि होगी। यदि स्रोत ऑब्जेक्ट में फ़ील्ड में अन्य ऑब्जेक्ट्स का कोई संदर्भ होता है, तो नए उदाहरण में केवल उन ऑब्जेक्ट्स का संदर्भ होगा, उन ऑब्जेक्ट्स की एक प्रति नहीं बनाई गई है। इसका अर्थ है कि यदि हम उथली प्रति में परिवर्तन करते हैं तो स्रोत वस्तु में परिवर्तन परिलक्षित होगा। दोनों उदाहरण स्वतंत्र नहीं हैं।

ऑब्जेक्ट क्लास में क्लोन विधि प्रकृति में संरक्षित है, इसलिए सभी वर्ग क्लोन () पद्धति का उपयोग नहीं कर सकते हैं। आपको क्लोन करने योग्य इंटरफ़ेस को लागू करने और क्लोन विधि को ओवरराइड करने की आवश्यकता है। यदि क्लोन करने योग्य इंटरफ़ेस लागू नहीं किया गया है, तो आपको CloneNotSupportedException.super.clone मिलेगा () ऑब्जेक्ट क्लास में कार्यान्वयन के अनुसार उथली प्रतिलिपि लौटाएगा।



शॉल कॉपी के लिए कोड

पैकेज com.test क्लास डिपार्टमेंट {स्ट्रिंग एम्पियर्ड स्ट्रिंग ग्रेड स्ट्रिंग पदनाम पब्लिक डिपार्टमेंट (स्ट्रिंग एम्पिड, स्ट्रिंग ग्रेड, स्ट्रिंग पदनाम) {this.empId = empId this.grad = ग्रेड this.designing = designation}} क्लास एम्प्लॉइज इम्प्लॉईज क्लोनिंग {इंट आईडी स्ट्रिंग नाम विभाग विभाग सार्वजनिक कर्मचारी (int आईडी, स्ट्रिंग नाम, विभाग विभाग) {this.id = id this.name = name this.dept = dept} // क्लोन का डिफ़ॉल्ट संस्करण () विधि। यह किसी वस्तु की उथली प्रति बनाता है। संरक्षित वस्तु क्लोन () फेंकता है CloneNotSupportedException {return super.clone ()}} सार्वजनिक वर्ग ShallowCopyInJava {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) {विभाग dept1 - नया विभाग ('1', 'A', 'AVP') कर्मचारी emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// emp1 का क्लोन बनाकर उसे emp2 emp2 = (Employee) emp1.clone ()} कैच (CloneNotSupportedException e) {e} में असाइन करें। PrintStackTrace ()} // 'emp1' के पदनाम को प्रिंट करना। System.out.println (emp1.dept.designation) // आउटपुट: AVP // 'emp2' के पदनाम को बदलना। यह परिवर्तन मूल कर्मचारी 'emp1' System.out.println (emp1.dept.designation) // आउटपुट: निदेशक}} में दिखाई देगा

आउटपुट:

कैसे एक iterator का उपयोग करने के लिए

Output-Shallow-Copy

उपरोक्त उदाहरण में, हमारे पास एक कर्मचारी वर्ग एम्प 1 है जिसमें तीन वर्ग चर आईडी (इंट), नाम (स्ट्रिंग) और विभाग (विभाग) हैं।

हमने अब एक समतुल्य प्रतिलिपि बनाने के लिए emp1 को emp2 पर क्लोन किया, उसके बाद हमने emp2 ऑब्जेक्ट का उपयोग करके पदनाम को बदल दिया और सत्यापित किया कि समान परिवर्तन भी emp1 में परिलक्षित हुए।


गहरी प्रति

किसी ऑब्जेक्ट की गहरी कॉपी में उथले कॉपी की तरह स्रोत ऑब्जेक्ट के सभी क्षेत्रों की एक सटीक प्रतिलिपि होगी, लेकिन स्लॉ कॉपी के विपरीत यदि स्रोत ऑब्जेक्ट में फ़ील्ड के रूप में ऑब्जेक्ट का कोई संदर्भ है, तो क्लोन की कॉल करके ऑब्जेक्ट की प्रतिकृति बनाई जाती है तरीका। इसका मतलब है कि स्रोत और गंतव्य दोनों वस्तुएं एक दूसरे से स्वतंत्र हैं। क्लोन ऑब्जेक्ट में किए गए किसी भी परिवर्तन से सोर्स ऑब्जेक्ट पर कोई प्रभाव नहीं पड़ेगा।

डीप कॉपी के लिए कोड

पैकेज com.test वर्ग विभाग लागू करता है क्लोन करने योग्य {स्ट्रिंग एम्पियर्ड स्ट्रिंग ग्रेड स्ट्रिंग पदनाम सार्वजनिक विभाग (स्ट्रिंग एम्पियड, स्ट्रिंग ग्रेड, स्ट्रिंग पदनाम) {this.empId = empId this.grad / ग्रेड this.designation = पदनाम} // क्लोन का डिफ़ॉल्ट संस्करण () तरीका। संरक्षित वस्तु क्लोन () फेंकता है CloneNotSupportedException {return super.clone ()}} वर्ग कर्मचारी लागू करता है क्लोन करने योग्य {int id नाम विभाग विभाग सार्वजनिक कर्मचारी (int आईडी, स्ट्रिंग नाम, विभाग विभाग) {this.id = आईडी this.name = नाम this.dept = dept} // किसी ऑब्जेक्ट की गहरी प्रतिलिपि बनाने के लिए ओवरराइडिंग क्लोन () विधि। संरक्षित वस्तु क्लोन () फेंकता है CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (विभाग) dept.clone () वापसी emp}} सार्वजनिक वर्ग DeepopyopyInJava {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) { विभाग विभाग 1 = नया विभाग ('1', 'ए', 'एवीपी') कर्मचारी एम्प 1 = नया कर्मचारी (111, 'जॉन', विभाग 1) कर्मचारी एंप्लॉई 2 = अशक्त कोशिश {// एएम 1 का एक क्लोन बनाना और इसे एम्प 2 को असाइन करना। emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // // 'emp1' के पदनाम को प्रिंट कर रहा है। System.out.println (emp1.dept.designation) // आउटपुट: AVP / / '2 'emp2.dept.designation =' निदेशक 'के पदनाम को बदलना // यह परिवर्तन मूल कर्मचारी' emp1 'System.out.println (emp1.dept.designation) // आउटपुट: AVP} में परिलक्षित होगा।

आउटपुट:

डीप कॉपी के उपरोक्त उदाहरण में, उथली प्रतिलिपि के विपरीत, स्रोत और गंतव्य ऑब्जेक्ट दोनों एक दूसरे से स्वतंत्र हैं। Emp2 में किया गया कोई भी परिवर्तन emp1 को प्रभावित नहीं करेगा।

शैलो कॉपी और डीप कॉपी में अंतर

उथली प्रतिलिपि गहरी प्रति
क्लोन ऑब्जेक्ट और सोर्स ऑब्जेक्ट पूरी तरह से असंतुष्ट नहीं हैंक्लोन किए गए ऑब्जेक्ट और स्रोत ऑब्जेक्ट पूरी तरह से एक दूसरे से स्वतंत्र हैं।
क्लोन किए गए उदाहरण में किए गए परिवर्तन स्रोत ऑब्जेक्ट के संदर्भ चर को प्रभावित करेंगेक्लोन किए गए उदाहरण में किए गए परिवर्तन स्रोत ऑब्जेक्ट के संदर्भ चर को प्रभावित नहीं करेंगे।
क्लोन का डिफ़ॉल्ट संस्करण उथली प्रति हैगहरी प्रतिलिपि बनाने के लिए हमें ऑब्जेक्ट क्लास के क्लोन विधि को ओवरराइड करने की आवश्यकता है।
यदि ऑब्जेक्ट के वर्ग चर केवल फ़ील्ड के रूप में आदिम प्रकार हैं, तो शेलो कॉपी पसंद की जाती हैयदि ऑब्जेक्ट के वर्ग चर में फ़ील्ड के रूप में अन्य ऑब्जेक्ट के संदर्भ हैं, तो एक गहरी प्रतिलिपि पसंद की जाती है।
यह अपेक्षाकृत तेज हैयह अपेक्षाकृत धीमा है।

इसके साथ, हम Shallow Copy और Deep Copy लेख के अंत में आते हैं। मुझे उम्मीद है कि आप दोनों के बीच के विभिन्न अंतरों को समझ पाएंगे।

इसकी जाँच पड़ताल करो 250,000 से अधिक संतुष्ट शिक्षार्थियों के एक नेटवर्क के साथ एक विश्वसनीय ऑनलाइन शिक्षण कंपनी, एडुरेका द्वारा, दुनिया भर में फैली हुई है। एडुर्का के जावा जे 2 ईई और एसओए प्रशिक्षण और प्रमाणन पाठ्यक्रम उन छात्रों और पेशेवरों के लिए डिज़ाइन किया गया है जो जावा डेवलपर बनना चाहते हैं।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया इसे 'शाल्लो कॉपी और डीप कॉपी' ब्लॉग के कमेंट सेक्शन में उल्लेख करें और हम जल्द से जल्द आपके पास वापस आएंगे।