डीप कॉपी और शैलो कॉपी दोनों दिए गए ऑब्जेक्ट की कॉपी बनाने के अलग-अलग तरीकों को संदर्भित करते हैं।
शैलो कॉपी
यह मूल रूप से ऑब्जेक्ट का एक नया इंस्टेंस बनाता है और मूल डेटा सेट से सभी डेटा को नव निर्मित इंस्टेंस में कॉपी करता है। इसका मतलब है कि नव निर्मित इंस्टेंस को मूल ऑब्जेक्ट में विशेष रूप से कास्ट करना पड़ता है। इसे 'शैलो क्लोनिंग' के रूप में भी जाना जाता है।
उदाहरण
import java.util.*;
class Demo {
private int[] my_data;
public Demo(int[] my_vals) {
my_data = my_vals; // केवल रेफरेंस कॉपी
}
public void displayData() {
System.out.println(Arrays.toString(my_data));
}
}
public class UseDemo {
public static void main(String[] args) {
int[] my_vals = {56, 89, 91};
Demo my_inst = new Demo(my_vals);
my_inst.displayData();
my_vals[0] = 65; // मूल ऐरे में परिवर्तन
my_inst.displayData(); // प्रभावित होता है!
}
}
आउटपुट
[56, 89, 91]
[65, 89, 91]
व्याख्या: Demo क्लास में एक वेरिएबल, और एक कंस्ट्रक्टर होता है जो ऐरे के तत्वों को एक नए ऐरे में कॉपी करता है। 'displayData' नामक एक अन्य फंक्शन इस डेटा ऐरे को प्रदर्शित करता है। मुख्य फंक्शन में, एक इंस्टेंस बनाया जाता है, ऐरे को परिभाषित किया जाता है, और फंक्शन को कॉल किया जाता है। सभी परिवर्तनों को प्रतिबिंबित करते हुए प्रासंगिक आउटपुट कंसोल पर प्रदर्शित होता है।
डीप कॉपी
यह तब उपयोग किया जाता है जब किसी अलग उद्देश्य या उपयोग के लिए डेटा की एक अलग कॉपी की आवश्यकता होती है। क्लास के सभी मेंबर्स को 'Cloneable' इंटरफेस को लागू करना होगा और 'clone' मेथड को ओवरराइड करना होगा।
उदाहरण
import java.util.*;
class Demo {
private int[] my_data;
public Demo(int[] my_vals) {
my_data = new int[my_vals.length]; // नया ऐरे बनाएं
for (int i = 0; i < my_data.length; i++) {
my_data[i] = my_vals[i]; // मान कॉपी करें
}
}
public void displayData() {
System.out.println(Arrays.toString(my_data));
}
}
public class UseDemo {
public static void main(String[] args) {
int[] my_vals = {56, 89, 91};
Demo my_inst = new Demo(my_vals);
my_inst.displayData();
my_vals[0] = 65; // मूल ऐरे में परिवर्तन
my_inst.displayData(); // अप्रभावित!
}
}
आउटपुट
[56, 89, 91]
[56, 89, 91]
व्याख्या: Demo क्लास में एक वेरिएबल, और एक कंस्ट्रक्टर होता है जो ऐरे के माध्यम से पुनरावृति करता है, और इसे दूसरे ऐरे में कॉपी करता है। 'displayData' नामक एक अन्य फंक्शन इस डेटा ऐरे को प्रदर्शित करता है। मुख्य फंक्शन में, एक इंस्टेंस बनाया जाता है, ऐरे को परिभाषित किया जाता है, और फंक्शन को कॉल किया जाता है। सभी परिवर्तनों को प्रतिबिंबित करते हुए प्रासंगिक आउटपुट कंसोल पर प्रदर्शित होता है।
तुलना तालिका:
| पहलू | शैलो कॉपी | डीप कॉपी |
|---|---|---|
| ऑब्जेक्ट रेफरेंस | साझा करता है | नए ऑब्जेक्ट्स बनाता है |
| म्यूटेबल फील्ड्स | साझा (परिवर्तन प्रभावित करते हैं) | स्वतंत्र (परिवर्तन अलग) |
| प्रदर्शन | तेज | धीमा |
| मेमोरी | कम | अधिक |
| कार्यान्वयन | डिफ़ॉल्ट clone() | कस्टम clone() या कॉपी कंस्ट्रक्टर |
Cloneable के साथ डीप कॉपी:
class DeepCopyDemo implements Cloneable {
private int[] data;
public DeepCopyDemo(int[] data) {
this.data = data.clone();
}
@Override
protected DeepCopyDemo clone() throws CloneNotSupportedException {
return (DeepCopyDemo) super.clone(); // प्रिमिटिव ऐरे के लिए काम करता है
}
}