Kotlin में लिस्ट क्लोन करना: डीप बनाम शैलो कॉपी (पूरी गाइड)

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Kotlin में लिस्ट क्लोन करना: रेफरेंस की गलतियों से कैसे बचें?

\n\n

कल्पना करें: आप Kotlin में एक ऐप लिख रहे हैं, डेटा की लिस्ट प्रोसेस कर रहे हैं, और अचानक आपकी ओरिजिनल लिस्ट अपने आप बदल जाती है। यह दर्द जाना-पहचाना है? हो सकता है कि आपने लिस्ट की कॉपी नहीं, बल्कि सिर्फ एक रेफरेंस कॉपी किया हो। इस आर्टिकल में हम Kotlin में लिस्ट क्लोन करने के सभी सही तरीके समझेंगे — शैलो कॉपी से लेकर डीप कॉपी तक। बिना बकवास, सिर्फ कोड और समझाइश।

\n\n

यह टॉपिक Stack Overflow पर एक बहुत लोकप्रिय सवाल (200,000+ व्यूज) से प्रेरित है: "How to clone or copy a list in kotlin". आइए एक बार और हमेशा के लिए समझ लें कि Kotlin में लिस्ट को सही तरीके से कैसे कॉपी करें, ताकि डेटा न खोएं और पागल न हों।

\n\n

सीधा असाइनमेंट क्यों काम नहीं करता?

\n\n

Kotlin में, Java की तरह, लिस्ट रेफरेंस टाइप होती हैं। अगर आप यह लिखते हैं:

\n\n
val original = mutableListOf("A", "B", "C")\nval copy = original  // यह कॉपी नहीं है!\ncopy.add("D")\nprintln(original) // [A, B, C, D] — ओरिजिनल बदल गया!
\n\n

आपने मेमोरी में उसी ऑब्जेक्ट का दूसरा रेफरेंस बना लिया है। copy के जरिए कोई भी बदलाव original को प्रभावित करेगा। इससे बचने के लिए, Kotlin लिस्ट कॉपी करने के खास तरीकों का इस्तेमाल करना होगा।

\n\n

Kotlin में लिस्ट कॉपी करने के 5 सबसे अच्छे तरीके

\n\n

हम सभी मुख्य विकल्प देखेंगे: सरल toList() से लेकर मैन्युअल डीप कॉपी तक। अपने काम के हिसाब से सही तरीका चुनें।

\n\n

1. toList() — सबसे आसान तरीका

\n\n

toList() मेथड एक नई अपरिवर्तनीय (immutable) कॉपी बनाता है। यह शैलो कॉपी (shallow copy) है — एलिमेंट खुद डुप्लिकेट नहीं होते, लेकिन लिस्ट की स्ट्रक्चर स्वतंत्र हो जाती है।

\n\n
val original = listOf("Kotlin", "Java", "Python")\nval copy = original.toList()\n\n// copy एक नया ऑब्जेक्ट है\nprintln(copy === original) // false — अलग रेफरेंस\nprintln(copy == original)  // true — कंटेंट एक जैसा
\n\n

स्ट्रिंग या नंबर की साधारण लिस्ट के लिए यह परफेक्ट है। अगर आपको बदलने योग्य (mutable) कॉपी चाहिए, तो toMutableList() इस्तेमाल करें।

\n\n

2. toMutableList() — बदलने योग्य कॉपी के लिए

\n\n

एक ऐसी कॉपी चाहिए जिसे आप बदल सकें? toMutableList() आपका विकल्प है। यह उन्हीं एलिमेंट के साथ एक नया MutableList बनाता है।

\n\n
val original = listOf(1, 2, 3)\nval mutableCopy = original.toMutableList()\nmutableCopy.add(4)\n\nprintln(original)       // [1, 2, 3]\nprintln(mutableCopy)    // [1, 2, 3, 4] — ओरिजिनल सुरक्षित
\n\n

यह Kotlin में mutable list क्लोन करने का सबसे लोकप्रिय तरीका है।

\n\n

3. ArrayList(collection) — Java का क्लासिक तरीका

\n\n

अगर आप Java से आए हैं, तो यह तरीका जाना-पहचाना लगेगा। ArrayList का कंस्ट्रक्टर दूसरी कलेक्शन लेता है और उसके एलिमेंट कॉपी करता है।

\n\n
val original = listOf("A", "B", "C")\nval arrayCopy = ArrayList(original)\narrayCopy[0] = "Z"\n\nprintln(original)    // [A, B, C]\nprintln(arrayCopy)   // [Z, B, C]
\n\n

यह तेज़ और भरोसेमंद है। लेकिन याद रखें: यह भी शैलो कॉपी है।

\n\n

4. map() — एलिमेंट को बदलने के साथ कॉपी

\n\n

अगर आपको सिर्फ कॉपी नहीं, बल्कि एलिमेंट को बदलना भी है, तो map() इस्तेमाल करें। यह पुरानी लिस्ट के हर एलिमेंट पर लैम्ब्डा लगाकर एक नई लिस्ट बनाता है।

\n\n
val numbers = listOf(10, 20, 30)\nval doubled = numbers.map { it * 2 }\n\nprintln(numbers)  // [10, 20, 30]\nprintln(doubled)  // [20, 40, 60]
\n\n

बिना बदलाव के सिर्फ कॉपी करने के लिए numbers.map { it } लिख सकते हैं, लेकिन यह ज़रूरत से ज़्यादा है — toList() बेहतर है।

\n\n

5. जटिल ऑब्जेक्ट के लिए डीप कॉपी (deep copy)

\n\n

ऊपर के सभी तरीके शैलो कॉपी करते हैं। अगर आपकी लिस्ट में बदलने योग्य ऑब्जेक्ट हैं (जैसे फील्ड वाला data class), तो कॉपी में ऑब्जेक्ट बदलने से ओरिजिनल भी बदल जाएगा:

ब्लॉग

पुस्तक अनुशंसाएँ