कोटरलिन में ArrayList <String> () और mutableListOf <String> () के बीच अंतर


101
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

दोनों परस्पर सूची हैं, फिर दो कीवर्ड का क्या मतलब है mutableListOfया ArrayList?

या कोई बड़ा अंतर है?


6
न तो mutableListOfहै और न ही ArrayListKotlin में कीवर्ड हैं
इल्या

जवाबों:


141

दोनों के बीच एकमात्र अंतर आपकी मंशा का संचार कर रहा है।

जब आप लिखते हैं val a = mutableListOf(), तो आप कह रहे हैं "मुझे एक परिवर्तनशील सूची चाहिए, और मैं कार्यान्वयन के बारे में विशेष रूप से परवाह नहीं करता हूं"। जब आप लिखते हैं, इसके बजाय, val a = ArrayList()आप कह रहे हैं "मैं विशेष रूप से चाहता हूं ArrayList"।

व्यवहार में, कोटलिन के वर्तमान कार्यान्वयन में जेवीएम के लिए संकलन, कॉलिंग mutableListOfएक उत्पादन करेगा ArrayList, और व्यवहार में कोई अंतर नहीं है: एक बार सूची के निर्माण के बाद, सबकुछ समान होगा।

अब, मान लें कि mutableListOfएक अलग प्रकार की सूची को वापस करने के लिए कोटलिन का भविष्य संस्करण बदल जाता है।

लिकलियर की तुलना में, कोटलिन टीम केवल तभी बदलाव करेगी, जब वे नए कार्यान्वयन को लागू करेंगे, जो अधिकांश उपयोग के मामलों के लिए बेहतर होगा। mutableListOfतब आप उस नई सूची के कार्यान्वयन को पारदर्शी तरीके से कर रहे होंगे, और आपको वह बेहतर व्यवहार मुफ्त में मिलेगा। साथ जानाmutableListOfअगर आपके मामले की तरह लगता है के ।

दूसरी ओर, हो सकता है कि आपने अपनी समस्या के बारे में सोचने में समय व्यतीत किया हो, और यह सोचा कि आपकी समस्या के लिए ArrayList वास्तव में सबसे उपयुक्त है, और आप कुछ उप-इष्टतम में स्थानांतरित होने का जोखिम नहीं उठाना चाहते हैं। तब आप शायद या तो ArrayListसीधे उपयोग करना चाहते हैं, या arrayListOfफ़ैक्टरी फ़ंक्शन (एक- ArrayListविशिष्ट एनालॉग से mutableListOf) का उपयोग करना चाहते हैं ।


21

mutableListOf<T>()इनलाइन फ़ंक्शन इनवोकेशन है जो एक रिटर्न देता है MutableList<T>। आज के रूप में, का mutableListOfएक उदाहरण देता है ArrayList

ArrayList<String>() एक निर्माता मंगलाचरण है और इनबिल्ट नहीं किया जा सकता है।

दूसरे शब्दों में, दिए गए:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a प्रकार का है MutableList<String>
  • b प्रकार का है ArrayList<String>

रनटाइम पर, दोनों aऔर bकी एक आवृत्ति का आयोजन करेगा ArrayList

ध्यान दें कि इनलाइनिंग विशेष रूप से उपयोगी है जब प्रकार के संशोधन के साथ जोड़ा जाता है , जो कि listOf, mutableListOfऔर इस तरह के अस्तित्व को सही ठहराता है ।


2
इसलिए कोई फर्क नहीं है।
साई

2
aऔर bअलग-अलग घोषित प्रकार हैं - इसलिए संकलन समय पर अंतर है।
10

इसे इनविट के रूप में देखा जा सकता हैval b = arrayListOf<String>()
व्लाद

8

जैसा कि आप सूत्रों में देख सकते हैं :

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

तो, कोई अंतर नहीं है, बस एक सुविधा विधि है।


1
और मैं उद्धरण में "सुविधा" डालूंगा। जब तक MutableList वास्तव में एक अलग कार्यान्वयन होता है, तब तक एक कोर ऑब्जेक्ट प्रदान करता है जो एक ही काम करता है जैसा कि एक अन्य कोर ऑब्जेक्ट भ्रामक है, और बिल्कुल भी नहीं। :(
माइक विलियमसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.