दिलचस्प पोस्ट
मैं केवल एक वर्ग में 2 तुलनात्मक तरीकों कैसे बना सकता हूं? पायथन 3 में execfile के लिए वैकल्पिक? पाड़ के बाद डेटाबेस को माइग्रेट नहीं किया जा सकता। धारा 2.2 रेल की ट्यूटोरियल पर रूबी माइकल हार्टल घुंघराले ब्रेसिज़ में सी कोड के ब्लॉक क्यों संलग्न हैं? आईओएस स्वचालित रूप से पाठ क्षेत्र में हाइफ़न जोड़ें एसक्यूएल व्यक्तिगत पंक्तियों की गणना के बजाय सभी पंक्तियों की गिनती करता है Msiexec / a का उपयोग कर प्रशासनिक स्थापना का उद्देश्य क्या है? कैसे सी में दो पूर्णांक को जोड़ने के लिए एनजी-अगर एनजी-दोहराने के अंदर का उपयोग करना है? JSON: मैं क्रॉस-डोमेन JSON कॉल कैसे कर सकता हूं JavaScript में डुप्लिकेट संदर्भ-मेनू को अक्षम कैसे करें जावा में अपवितरित विधियों या कक्षाओं का उपयोग करना गलत है? React.js: एक ऑन चार्ज हैंडलर के साथ विभिन्न इनपुट की पहचान करना Xcode में बेस एसडीके, आईओएस तैनाती लक्ष्य, लक्ष्य और परियोजना का क्या अर्थ है? सेटपिक्सेल बहुत धीमा है क्या बिटमैप में आकर्षित करने का एक तेज़ तरीका है?

जावा में, उथले प्रतिलिपि क्या है?

java.util.Calendar.clone () "उसी संपत्ति के साथ एक नया कैलेंडर" देता है और "इस कैलेंडर की उथले प्रतिलिपि" देता है।

यह एक उथले प्रति दिखाई नहीं देता जैसा कि उत्तर में SO उस प्रश्न को भाषा-अज्ञेयवादी टैग किया गया है , जावा भाषा अज्ञेय परिभाषा का पालन नहीं करता है जैसा कि मैंने कोड के माध्यम से कदम रखा है, मुझे लगता है कि संरचना और तत्वों को इस नए ऑब्जेक्ट में कॉपी किया जाता है, केवल भाषा अज्ञेय संरचना से भी ज्यादा।

जावा में, उथले प्रतिलिपि क्या है?

यह एक जावा गहरी कॉपी से कैसे भिन्न होता है (यदि वह मौजूद है)?

Solutions Collecting From Web of "जावा में, उथले प्रतिलिपि क्या है?"

एक उथले प्रतिलिपि सिर्फ कक्षा में दिए गए संदर्भों के मूल्यों की प्रतिलिपि बनाता है। एक गहरी प्रतिलिपि मूल्यों की प्रतिलिपि बनाता है दिया हुआ:

class Foo { private Bar myBar; ... public Foo shallowCopy() { Foo newFoo = new Foo(); newFoo.myBar = myBar; return newFoo; } public Foo deepCopy() { Foo newFoo = new Foo(); newFoo.myBar = myBar.clone(); //or new Bar(myBar) or myBar.deepCopy or ... return newFoo; } } Foo myFoo = new Foo(); Foo sFoo = myFoo.shallowCopy(); Foo dFoo = myFoo.deepCopy(); myFoo.myBar == sFoo.myBar => true myFoo.myBar.equals(sFoo.myBar) => true myFoo.myBar == dFoo.myBar => **false** myFoo.myBar.equals(dFoo.myBar) => true 

इस मामले में उथले प्रति एक ही संदर्भ ( == ) होता है और गहरी प्रतिलिपि के पास एक समान संदर्भ ( .equals() )।

यदि कोई परिवर्तन उथले प्रतिलिपि संदर्भ के मूल्य के लिए किया जाता है, तो प्रति वह परिवर्तन को दर्शाता है क्योंकि यह एक ही संदर्भ साझा करता है यदि कोई गहराई से प्रतिलिपि संदर्भ के मूल्य के लिए एक परिवर्तन किया जाता है, तो प्रति वह परिवर्तन नहीं दर्शाता क्योंकि यह एक ही संदर्भ को साझा नहीं करता है

सी-वाद

 int a = 10; //init int& b = a; //shallow - copies REFERENCE int c = a; //deep - copies VALUE ++a; 

परिणाम:

 a is 11 *b is 11 c is 10 

उथला प्रति एक ही मेमोरी स्थानों के लिए एक संकेतक का एक सेट है असल में यह एक वास्तविक प्रतिलिपि नहीं बनाती है जिससे स्मृति उपयोग कम हो।

एक गहरी प्रति के मामले में, मेमोरी सेगमेंट की एक सटीक प्रतिलिपि बनाई गई है और पॉइंटर्स नए स्मृति स्थानों पर सेट हैं इसलिए सिद्धांत रूप से स्मृति खपत इस मामले में दो बार होना चाहिए।

उथले प्रति एक ऑब्जेक्ट के संदर्भ पॉइंटर की एक प्रति है, जबकि एक गहरी प्रतिलिपि वस्तु की एक प्रति है। जावा में वस्तुओं को पृष्ठभूमि में रखा जाता है, ऑब्जेक्ट्स के साथ व्यवहार करते समय सामान्य रूप से आप इंटरैक्ट करते हैं पॉइंटर्स वेरिएबल नाम ऑब्जेक्ट की मेमोरी स्पेस को इंगित करते हैं। एक उथले प्रतिलिपि बनाई जाती है जब आप एक समान के समान एक चर सेट करते हैं:

 Object B = A; 

ऑब्जेक्ट ए के गुणों को प्राप्त करके और उन्हें एक नए ऑब्जेक्ट बी में डालकर एक गहरी प्रतिलिपि बनाई जा सकती है।

 Object B = new Object(A.getProperty1(), A.getProperty2()...); 

यह उस प्रोग्राम के व्यवहार को प्रभावित करता है, यदि आप एक उथले प्रतिलिपि बनाते हैं और उस पर कार्य करते हैं, जो ऑब्जेक्ट के सभी उथले प्रतियों को प्रभावित करता है। यदि आप एक गहरी प्रतिलिपि में परिवर्तन करते हैं, तो केवल उस प्रति प्रभावित होता है मुझे आशा है कि यह आपके लिए पर्याप्त विस्तृत है

1.6 डॉक्स दस्तावेज़ कैलेंडर.क्लोन "के रूप में बनाता है और इस वस्तु की एक प्रति देता है।" Object.clone द्वारा निर्दिष्ट एक शाब्दिक उथले प्रतिलिपि कोई मतलब नहीं होगा। जावा शब्द "उथले प्रतिलिपि" का प्रयोग काफी सामान्य अर्थों में करता है

यह प्रलेखन में एक गलती प्रतीत होता है। मुझे नहीं पता कि एंड्रॉइड के कैलेंडर। क्लोन पद्धति किसी भी तरह की "उथले प्रतिलिपि" की सामान्य परिभाषा (जावा में या अन्यथा) को पूरा करती है।

आपको यह दस्तावेज कहां मिल रहा है?

Java.sun.com पर आधिकारिक जावा 6 डॉक्स बस कैलेंडर. clone () ऑब्जेक्ट की प्रतिलिपि वापस कर रहा है। उथले का कोई जिक्र नहीं है

अधिक सामान्यतः, जावा में एक उथले प्रतिलिपि एक है, जहां आपको एक नया ऑब्जेक्ट संदर्भ मिलता है लेकिन नया ऑब्जेक्ट मूल (प्रत्यक्ष या अप्रत्यक्ष) डेटा के संदर्भ में रखता है।

उदाहरण के लिए:

 class MyClass{ private List<Integer> innerList; public MyClass(List<Integer> list) { innerList = list; } //Some code... public Object clone(){ return new MyClass(innerList); } } 

उसके क्लोन में एक उथले प्रतिलिपि देता है ()

सबसे पहले, अगर हम एक-आयामी arrays के बारे में बात कर रहे हैं, तो ArrayList का जावडॉक कुछ हद तक गलत है, क्योंकि यह विधि की प्रतिलिपि को एरे में प्रयोग करता है। इसलिए क्लोन () एक-आयामी प्रति को वापस देता है, कम से कम 1.5 के बाद (मैं आगे की जांच नहीं करता)! तो यही है कि जावा में "उथले" का अर्थ है: एक-आयामी

आप यहां अधिक पढ़ सकते हैं: http://www.javapractices.com/topic/TopicAction.do?Id=3 तो क्लोन () कोई उथले प्रति नहीं है! यदि आप एक एक-आयामी सरणी की एक असली उथले प्रति चाहते हैं, तो बस इसे संदर्भ दें:

 Array a = new Array(); Array b = a; //a is only a shallow copy, nice for synchronisation 

जावा में एरेज़ मुश्किल होते हैं, क्योंकि जावा पास-बाय-वैल्यू भी करता है, लेकिन सरणियों के मूल्य केवल उनके संकेत हैं! दूसरी ओर, यह हमें वस्तुओं को सिंक्रनाइज़ करने की अनुमति देता है, जो एक बड़ी बात है। फिर भी, कुछ समस्याएं हैं यदि आप सरणियों (या ऐरेएलिस्ट) के भीतर सरणियों का उपयोग करते हैं, क्योंकि कंटेनर सरणी (या ऐरेलिस्ट) की क्लोन () उनके मूल्यों की प्रतिलिपि नहीं करेंगे, केवल उनके संदर्भ! इसलिए आपको किसी भी सरणियों को किसी सरणी में नहीं डालना चाहिए, आपको केवल ऑरेंज में वस्तुओं से निपटना चाहिए!

और कभी-कभी समझना जवाडोक मुश्किल है, इसलिए कोशिश का परीक्षण करें …

मज़े करो!

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

ढेर पर एक नया ऑब्जेक्ट प्राप्त करने के लिए, किसी को गहरी क्लोनिंग करना पड़ता है जिसे सीरियललाइजेशन और डी-सीरियलाइज़ेशन द्वारा कार्यान्वित किया जा सकता है।

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

गहरी नकल क्लोन न केवल आदिम मान, यह वस्तु संदर्भ की प्रतियां भी बनाता है।

आप यहां इस पर काम करने का उदाहरण देख सकते हैं: https://codingninjaonline.com/2017/11/09/deep-vs-shallow-copy/