कोट्रलिन में इंटेरियर बनाम ऐरे <Int>


91

मुझे यकीन नहीं है कि कोटलीन में एक IntArrayऔर एक के बीच का अंतर क्या Array<Int>है और मैं उनका उपयोग क्यों नहीं कर सकता हूं:

missmatch

मैं जानता हूँ कि IntArrayकरने के लिए अनुवाद int[]जब लक्षित करने JVMके लिए, लेकिन क्या करता है Array<Int>के लिए अनुवाद न करें?

इसके अलावा, आप भी कर सकते हैं String[]या YourObject[]। क्यों कोटलिन में प्रकार की कक्षाएं होती हैं {primitive}Arrayजब बहुत कुछ भी एक सरणी में व्यवस्थित किया जा सकता है, न केवल आदिम।


1
मेरे अनुमान है कि Array<Int>करने के लिए compiles Integer[](यदि संकलक इस अनुकूलन नहीं करता)
Mibac


हाँ, यह बहुत समझ में आता है, आप दोनों को धन्यवाद!
FRR

जवाबों:


111

Array<Int>एक है Integer[], जबकि, हुड के नीचे IntArrayएक है int[]। बस।

इसका मतलब यह है कि जब आप एक Intमें डालते हैं Array<Int>, तो यह हमेशा बॉक्सिंग किया जाएगा (विशेष रूप से, एक Integer.valueOf()कॉल के साथ )। के मामले में IntArray, कोई मुक्केबाज़ी नहीं होगी, क्योंकि यह एक जावा आदिम सरणी में अनुवाद करता है।


उपरोक्त के संभावित प्रदर्शन निहितार्थ के अलावा, विचार करने की सुविधा भी है। आदिम सरणियों को असंवैधानिक रूप से छोड़ा जा सकता है और उनके 0सभी सूचकांक में डिफ़ॉल्ट मान होंगे । यही कारण है कि IntArrayऔर बाकी के आदिम सरणियों में निर्माणकर्ता हैं जो केवल एक आकार पैरामीटर लेते हैं:

val arr = IntArray(10)
println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

इसके विपरीत, Array<T>एक निर्माणकर्ता नहीं होता है जो केवल एक आकार पैरामीटर लेता है: इसे Tनिर्माण के बाद एक वैध स्थिति में रहने के लिए सभी अनुक्रमित पर वैध, गैर-शून्य उदाहरणों की आवश्यकता होती है । के लिए Numberप्रकार, यह डिफॉल्ट हो सकता है 0, लेकिन वहाँ एक मनमाना प्रकार का डिफ़ॉल्ट उदाहरण बना करने के लिए कोई रास्ता नहीं है T

इसलिए जब एक बनाने Array<Int>, आप या तो निर्माणकर्ता का उपयोग कर सकते हैं जो एक इनिशियलाइज़र फ़ंक्शन भी लेता है:

val arr = Array<Int>(10) { index -> 0 }  // full, verbose syntax
val arr = Array(10) { 0 }                // concise version

या Array<Int?>हर मूल्य को इनिशियलाइज़ करने से बचने के लिए एक बनाएं , लेकिन फिर आपको बाद nullमें सरणी से पढ़े जाने वाले संभावित मूल्यों से निपटने के लिए मजबूर किया जाएगा ।

val arr = arrayOfNulls<Int>(10)

4
यह काफी बेवकूफी भरा फैसला है। इस वजह से, उन्हें प्रत्येक आदिम प्रकार के लिए एक नया वर्ग बनाना पड़ा ... वे सिर्फ जावा पर उपयोग कर सकते थे।
एंड्रॉइड डेवलपर 7

1
@androiddeveloper क्या नया वर्ग है? int[]है IntArray, Integer[]है Array<Int>, और इतने पर, जहां इस रहस्यमय नए वर्ग है? यह एक ही बात है केवल वाक्यविन्यास अलग है। int[]भी वर्ग है, वैसे
यूजेन पिसेंक

1
@EugenPechanec यह दिलचस्प है। वे कहते हैं कि यह एक वर्ग है और इसका एक उदाहरण है, लेकिन "इस वर्ग के उदाहरणों को int []": kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int-array/… के रूप में दर्शाया गया है । तो, क्या वे कार्य केवल विस्तार कार्य हैं, या वे एक वास्तविक वर्ग के हैं? और "इंट्रेयर", और अन्य की आवश्यकता क्यों थी? अभी भी सिर्फ जावा सिंटैक्स का उपयोग किया जा सकता है।
एंड्रॉयड डेवलपर

1
@EugenPechanec जावा में, int [] एक वर्ग नहीं है? यह एक वस्तु है, आदिमों की एक सरणी है। आप कोड तक नहीं पहुंच सकते हैं, या उससे विस्तार नहीं कर सकते हैं। नहीं? जावा पर सभी वर्गों के पास उनके नाम का एक बड़ा अक्षर है। यहाँ यह नहीं है।
एंड्रॉयड डेवलपर

1
@EugenPechanec तो कोटलिन पर यह एक वर्ग है, जबकि जावा पर यह नहीं है। फिर भी क्यों नहीं मिलता है। वे सिर्फ विस्तार कार्य जोड़ सकते हैं, नहीं? आप शायद इंट्रे से विस्तार कर सकते हैं? नामकरण के बारे में, मुझे पता है। यह सिर्फ सम्मेलन है, और एक अच्छा भी है।
Android डेवलपर

6

यह ध्यान देने योग्य है कि वसीयत *पर प्रसार ( ) ऑपरेटर का उपयोग कर varargवापस आ जाएगा IntArray। यदि आपको एक की आवश्यकता है Array<Int>, तो आप अपने IntArrayउपयोग को परिवर्तित कर सकते हैं .toTypedArray()


1

कोटलिन में एरेस कक्षाएं हैं (जावा की तरह "विशेष" प्रकार नहीं)।

कोटलिन की स्टडलिब जावा भाषा एकीकरण और प्रदर्शन को बेहतर बनाने के लिए जेवीएम आदिम सरणियों के लिए विशेष प्रयोजन कक्षाएं प्रदान करती है।

अंगूठे के नियम का उपयोग करना होगा Array<T>सिवाय अगर यह मौजूदा जावा कोड के साथ मिश्रण करते समय समस्या पैदा करता है, या जावा कक्षाओं से बुलाया जाना चाहिए। रिकॉर्ड के लिए, मुझे कभी भी उपयोग नहीं करना पड़ा IntArray

आप इस मामले के बारे में भाषा का दस्तावेज़ीकरण यहाँ देख सकते हैं: https://kotlinlang.org/docs/reference/basic-types.html#arrays


मेरा मानना ​​है कि आप हमेशा ऐरे के बारे में सही हैं <T> IntArray के ऊपर, मैं बॉक्सिंग प्रकार बनाम आदिम का उपयोग करने के मुक्केबाजी / अनबॉक्सिंग ओवरहेड के बारे में चिंतित था, लेकिन ऐसा लगता है कि कोटलिन काफी स्मार्ट है यह तय करने के लिए कि वह एक आदिम का उपयोग कर सकता है या नहीं । (मुझे सही करें अगर मैं गलत हूं) "जावा प्लेटफॉर्म पर, संख्याओं को भौतिक रूप से जेवीएम आदिम प्रकारों के रूप में संग्रहीत किया जाता है, जब तक कि हमें एक अशक्त संख्या संदर्भ (जैसे इंट?) या जेनरिक शामिल नहीं होते हैं। बाद वाले मामलों में नंबर बॉक्स किए जाते हैं।" से kotlinlang.org/docs/reference/basic-types.html
FRR

@feresr नहीं किसी भी तरह से एक विशेषज्ञ है, लेकिन मुझे लगता है कि केवल के कार्यान्वयन से बात कर रहा है Int, Float, आदि, यह देखते हुए कि Kotlin के लिए एक अलग प्रकार का नहीं है Booleanया boolean। सरणियों के संदर्भ में, मैं मानूंगा कि Array<Int>इससे भिन्न होगा IntArray। मैंने व्यक्तिगत रूप से हमेशा बाद वाले का उपयोग किया है क्योंकि यह मुझे कभी परेशान नहीं करता है, लेकिन शायद कोटलिन के पास अतिरिक्त अनुकूलन है जो मुझे पता नहीं है। यदि आप पूरी तरह से कोटलिन में प्रोग्रामिंग कर रहे हैं, तो मुझे ऐसा कोई मामला नहीं दिखता है, जहाँ आपको एक के ऊपर एक की जरूरत हो, लेकिन आदिम सरणी में अभी भी कुछ लाभ हो सकते हैं।
एलन डब्ल्यू

@AllanW एक विशेषज्ञ भी नहीं है, बस जिज्ञासु है, मेरा मानना ​​है कि जावा में प्राइमिटिव्स और बॉक्सिंग ऑब्जेक्ट्स दोनों हैं क्योंकि यह प्राइमेटिक्स के साथ काम करने के लिए अधिक कुशल है? ठीक है, निश्चित रूप से कभी-कभी आपको ऑब्जेक्ट (अशक्तता / जेनरिक) के साथ काम करने की आवश्यकता होती है। यह मेरे मूल प्रश्न के दायरे से बाहर है लेकिन मुझे आश्चर्य है कि जेवीएम को लक्षित करते समय कोटलिन इसे कैसे संभालता है। मैं जब भी संभव हो IntArray का उपयोग करने की कोशिश करता हूं (यह सोचकर कि यह हुड के तहत आदिम का उपयोग कर रहा है) लेकिन @ ठेला टिप्पणी के बाद मुझे अब यकीन नहीं है।
FRR

1
@ मुझे देखें, कोटलिन के डॉक्स स्पष्ट रूप से कहते हैं कि बॉक्सिंग ओवरहेड से बचने के लिए विशेष सरणी उदाहरण हैं। मेरा मार्ग यह है कि दोनों अलग-अलग हैं, और डेवलपर के अंत में यह निर्णय लेने के समान है कि आप जावा में Integer [] या int [] का उपयोग करना चाहते हैं।
एलन डब्ल्यू

मैं सहमत हूं, फिर स्वीकार किया गया उत्तर नए लोगों को गुमराह करने वाला हो सकता है, मैं इसे इस कारण से स्वीकृत उत्तर के रूप में चिन्हित कर रहा हूं।
FRR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.