Kotlin में लिस्ट क्लोन करना: रेफरेंस की गलतियों से कैसे बचें?
\n\nकल्पना करें: आप Kotlin में एक ऐप लिख रहे हैं, डेटा की लिस्ट प्रोसेस कर रहे हैं, और अचानक आपकी ओरिजिनल लिस्ट अपने आप बदल जाती है। यह दर्द जाना-पहचाना है? हो सकता है कि आपने लिस्ट की कॉपी नहीं, बल्कि सिर्फ एक रेफरेंस कॉपी किया हो। इस आर्टिकल में हम Kotlin में लिस्ट क्लोन करने के सभी सही तरीके समझेंगे — शैलो कॉपी से लेकर डीप कॉपी तक। बिना बकवास, सिर्फ कोड और समझाइश।
\n\nयह टॉपिक Stack Overflow पर एक बहुत लोकप्रिय सवाल (200,000+ व्यूज) से प्रेरित है: "How to clone or copy a list in kotlin". आइए एक बार और हमेशा के लिए समझ लें कि Kotlin में लिस्ट को सही तरीके से कैसे कॉपी करें, ताकि डेटा न खोएं और पागल न हों।
\n\nसीधा असाइनमेंट क्यों काम नहीं करता?
\n\nKotlin में, Java की तरह, लिस्ट रेफरेंस टाइप होती हैं। अगर आप यह लिखते हैं:
\n\nval original = mutableListOf("A", "B", "C")\nval copy = original // यह कॉपी नहीं है!\ncopy.add("D")\nprintln(original) // [A, B, C, D] — ओरिजिनल बदल गया!\n\nआपने मेमोरी में उसी ऑब्जेक्ट का दूसरा रेफरेंस बना लिया है। copy के जरिए कोई भी बदलाव original को प्रभावित करेगा। इससे बचने के लिए, Kotlin लिस्ट कॉपी करने के खास तरीकों का इस्तेमाल करना होगा।
Kotlin में लिस्ट कॉपी करने के 5 सबसे अच्छे तरीके
\n\nहम सभी मुख्य विकल्प देखेंगे: सरल toList() से लेकर मैन्युअल डीप कॉपी तक। अपने काम के हिसाब से सही तरीका चुनें।
1. toList() — सबसे आसान तरीका
\n\ntoList() मेथड एक नई अपरिवर्तनीय (immutable) कॉपी बनाता है। यह शैलो कॉपी (shallow copy) है — एलिमेंट खुद डुप्लिकेट नहीं होते, लेकिन लिस्ट की स्ट्रक्चर स्वतंत्र हो जाती है।
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() इस्तेमाल करें।
2. toMutableList() — बदलने योग्य कॉपी के लिए
\n\nएक ऐसी कॉपी चाहिए जिसे आप बदल सकें? toMutableList() आपका विकल्प है। यह उन्हीं एलिमेंट के साथ एक नया MutableList बनाता है।
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\n3. ArrayList(collection) — Java का क्लासिक तरीका
\n\nअगर आप Java से आए हैं, तो यह तरीका जाना-पहचाना लगेगा। ArrayList का कंस्ट्रक्टर दूसरी कलेक्शन लेता है और उसके एलिमेंट कॉपी करता है।
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\n4. map() — एलिमेंट को बदलने के साथ कॉपी
\n\nअगर आपको सिर्फ कॉपी नहीं, बल्कि एलिमेंट को बदलना भी है, तो map() इस्तेमाल करें। यह पुरानी लिस्ट के हर एलिमेंट पर लैम्ब्डा लगाकर एक नई लिस्ट बनाता है।
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() बेहतर है।
5. जटिल ऑब्जेक्ट के लिए डीप कॉपी (deep copy)
\n\nऊपर के सभी तरीके शैलो कॉपी करते हैं। अगर आपकी लिस्ट में बदलने योग्य ऑब्जेक्ट हैं (जैसे फील्ड वाला data class), तो कॉपी में ऑब्जेक्ट बदलने से ओरिजिनल भी बदल जाएगा: