कोटलिन में सूची और सरणी प्रकार के बीच अंतर


189

Listऔर Arrayप्रकारों के बीच अंतर क्या है ?
ऐसा लगता है कि उनके साथ एक ही ऑपरेशन कर सकते हैं (लूप्स, फिल्टर एक्सप्रेशन, आदि ..), क्या व्यवहार या उपयोग में कोई अंतर है?

val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")

for (name in names1)
    println(name)
for (name in names2)
    println(name)

जवाबों:


280

एरे और सूचियाँ ( List<T>इसके उपप्रकार द्वारा दर्शाई गई MutableList<T>) के कई अंतर हैं, यहाँ सबसे महत्वपूर्ण हैं:

  • Array<T>ज्ञात कार्यान्वयन के साथ एक वर्ग है: यह एक अनुक्रमिक निश्चित आकार का मेमोरी क्षेत्र है जिसमें आइटम संग्रहीत होते हैं (और JVM पर यह जावा सर्वर द्वारा दर्शाया गया है )।

    List<T>और MutableList<T>: इंटरफेस है जो विभिन्न कार्यान्वयन कर रहे हैं ArrayList<T>, LinkedList<T>आदि मेमोरी प्रतिनिधित्व और संचालन सूचियों का तर्क ठोस कार्यान्वयन, जैसे में परिभाषित कर रहे हैं एक में अनुक्रमण LinkedList<T>लिंक के माध्यम से चला जाता है और जबकि हे (एन) समय लगता ArrayList<T>भंडार एक गतिशील आवंटित सरणी में अपने आइटम नहीं है।

    val list1: List<Int> = LinkedList<Int>()
    val list2: List<Int> = ArrayList<Int>()
  • Array<T>परिवर्तनशील है (इसे किसी भी संदर्भ के माध्यम से बदला जा सकता है), लेकिन List<T>इसमें संशोधन करने के तरीके नहीं हैं (यह या तो केवल पढ़ने योग्य हैMutableList<T> या एक अपरिवर्तनीय सूची कार्यान्वयन है )।

    val a = arrayOf(1, 2, 3)
    a[0] = a[1] // OK
    
    val l = listOf(1, 2, 3)
    l[0] = l[1] // doesn't compile
    
    val m = mutableListOf(1, 2, 3)
    m[0] = m[1] // OK
  • Arrays का निश्चित आकार होता है और पहचान बरकरार रखने का विस्तार या छोटा नहीं कर सकता (आपको इसे आकार देने के लिए किसी सरणी की प्रतिलिपि बनाने की आवश्यकता होती है)। जैसा कि सूचियों, MutableList<T>में है addऔर removeकार्य करता है, ताकि यह अपने आकार को बढ़ा सके और कम कर सके।

    val a = arrayOf(1, 2, 3)
    println(a.size) // will always be 3 for this array
    
    val l = mutableListOf(1, 2, 3)
    l.add(4)
    println(l.size) // 4
  • Array<T>पर अपरिवर्तनीय हैT ( Array<Int>नहीं है Array<Number>), के लिए समान है MutableList<T>, लेकिन List<T>सहसंयोजक ( List<Int>है List<Number>)।

    val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
    val l: List<Number> = listOf(1, 2, 3) // OK
  • सरणी पुरातन लिए अनुकूलित कर रहे: अलग देखते हैं IntArray, DoubleArray, CharArrayआदि जो जावा आदिम सरणियों पर मैप किए जाते ( int[], double[], char[]), नहीं बॉक्सिंग लोगों ( Array<Int>जावा के लिए मैप किया गया है Integer[])। सामान्य तौर पर सूचियों में आदिम के लिए अनुकूलित कार्यान्वयन नहीं होते हैं, हालांकि कुछ पुस्तकालय (JDK के बाहर) आदिम-अनुकूलित सूची प्रदान करते हैं।

  • List<T>और MutableList<T>कर रहे हैं प्रकार मैप किया और जावा अंतर में विशेष व्यवहार (जावा के लिए है List<T>के रूप में या तो Kotlin से देखा जाता है List<T>या MutableList<T>)। Arrays की मैपिंग भी की जाती है, लेकिन उनके पास जावा इंटरऑपरेबिलिटी के अन्य नियम हैं

  • कुछ सरणी प्रकार का उपयोग एनोटेशन (आदिम सरणियों, Array<String>और enum classप्रविष्टियों के साथ सरणियों ) में किया जाता है, और एनोटेशन के लिए एक विशेष सरणी शाब्दिक वाक्यविन्यास है । सूची और अन्य संग्रह का उपयोग एनोटेशन में नहीं किया जा सकता है।

  • उपयोग के रूप में, अच्छा अभ्यास आपके कोड के प्रदर्शन के महत्वपूर्ण हिस्सों को छोड़कर हर जगह सरणियों की सूची का उपयोग करना पसंद करता है, तर्क जावा के लिए समान है ।


26

उपयोग पक्ष से प्रमुख अंतर यह है कि Arrays का एक निश्चित आकार होता है जबकि (Mutable)Listगतिशील रूप से उनके आकार को समायोजित कर सकते हैं। इसके अलावा Arrayपरिवर्तनशील है, जबकि Listनहीं है।

इसके अलावा kotlin.collections.Listएक इंटरफ़ेस दूसरों द्वारा कार्यान्वित किया जाता है java.util.ArrayList। इसका kotlin.collections.MutableListउपयोग तब भी किया जाता है जब आइटम संग्रह के लिए अनुमति देने वाले संग्रह की आवश्यकता होती है।

जेवीएम स्तर पर सरणियोंArray द्वारा दर्शाया जाता हैListदूसरी ओर java.util.Listजावा में उपलब्ध अपरिवर्तनीय संग्रह समतुल्य होने के कारण इसका प्रतिनिधित्व किया जाता है ।


मैं यहां पूरी तरह से आश्वस्त नहीं हूं। में क्या है Array? केवल यह तत्व है - उसी में List। का आकार Listभी निश्चित है।
AndroidEx

1
@AndroidEx निम्नलिखित संकलन करेगा, val intArray = arrayOf(1,2,3); intArray[0] = 2जबकि यह नहीं करेगा val intList = listOf(1,2,3); intList[0] = 2Listवास्तव में एक निश्चित आकार की है लेकिन MutableListजो फैली यह नहीं है इसलिए यह संभव है कि एक val a:List<Int>अलग रिपोर्ट करेंगे sizeआगामी कॉल पर।
miensol

यह उपयोग करने के लिए अनुशंसित है Listया ArrayList?
इगोरगानापोलस्की

2
@IgorGanapolsky यदि आप ठोस कार्यान्वयन उपयोग List(शायद मामलों का 99%) के बारे में परवाह नहीं करते हैं । आप कार्यान्वयन उपयोग के बारे में देखभाल करते हैं ArrayListया LinkedListया किसी अन्य ठोस कार्यान्वयन।
मिनेसोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.