2016-03-28 37 views
47

में सूची और ऐरे प्रकारों के बीच अंतर 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) 

उत्तर

88

Arrays और सूचियों (List<T> का प्रतिनिधित्व करती है और इसके उप-प्रकार MutableList<T>) कई मतभेद हैं, यहाँ सबसे महत्वपूर्ण हैं:

  • Array<T> ज्ञात कार्यान्वयन के साथ एक वर्ग है: यह एक अनुक्रमिक निश्चित-आकार स्मृति क्षेत्र है वस्तुओं को संग्रहीत करना (और JVM पर इसे Java array द्वारा दर्शाया गया है)। ArrayList<T>, सूचियों के LinkedList<T> आदि मेमोरी प्रतिनिधित्व और संचालन तर्क ठोस कार्यान्वयन में परिभाषित कर रहे हैं, उदाहरण के लिए:

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

    val list1: List<Int> = LinkedList<Int>() 
    val list2: List<Int> = ArrayList<Int>() 
    
  • Array<T> परिवर्तनशील है (यह यह करने के लिए किसी भी संदर्भ के माध्यम से बदला जा सकता है), लेकिन List<T> संशोधित विधियां नहीं हैं (यह या तो read-only view of MutableList<T> या एक immutable list implementation है)।

    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 
    
  • सरणी आकार तय कर दी है और विस्तार या पहचान को बनाए रखना हटना नहीं कर सकते हैं (यदि आप इसे आकार बदलने के लिए एक सरणी कॉपी करने की जरूरत है)। सूचियों के अनुसार, 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>invariant on T है (Array<Int>Array<Number> नहीं है), MutableList<T> के लिए एक ही है, लेकिन List<T> covariant है (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[]) पर मैप किए गए हैं, boxed वाले (Array<Int> जावा के Integer[] पर मैप किए गए हैं)। सामान्य रूप से सूची में प्राइमेटिव के लिए अनुकूलित कार्यान्वयन नहीं होते हैं, हालांकि कुछ पुस्तकालय (जेडीके के बाहर) आदिम-अनुकूलित सूचियां प्रदान करते हैं।

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

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

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

10

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

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

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

+0

मैं यहां पूरी तरह से आश्वस्त नहीं हूं। 'ऐरे' में क्या व्यवहार्य है? केवल यह तत्व है - 'सूची' में वही। 'सूची' का आकार भी तय किया गया है। – AndroidEx

+0

@AndroidEx निम्नलिखित 'वैल intArray = arrayOf (1,2,3) संकलित करेगा; intArray [0] = 2' जबकि यह 'वैल intlist = listOf (1,2,3) नहीं होगा; Intist [0] = 2'। 'सूची' में वास्तव में एक निश्चित आकार होता है लेकिन 'म्यूटेबल लिस्ट' जो इसे विस्तारित करता है, इसलिए यह संभव नहीं है कि 'वैल ए: सूची ' बाद की कॉल पर अलग-अलग 'आकार' की रिपोर्ट करेगी। – miensol

+0

सहमत, स्पष्टीकरण के लिए धन्यवाद – AndroidEx