কোটলিনে ইনআর্রে বনাম অ্যারে <ইন্ট>


91

আমি নিশ্চিত নই যে কোটলিনে একটি IntArrayএবং Array<Int>আ এর মধ্যে পার্থক্য কী এবং কেন আমি এগুলি পরস্পর পরিবর্তে ব্যবহার করতে পারি না:

মিসম্যাচ

আমি জানি যে এটি টার্গেট IntArrayকরার int[]সময় অনুবাদ করে JVMতবে কী Array<Int>অনুবাদ করে?

এছাড়াও, আপনিও থাকতে পারেন String[]বা YourObject[]। কোটলিনের ধরণের শ্রেণি কেন রয়েছে {primitive}Arrayযখন কেবলমাত্র আদিম নয়, কোনও অ্যারেতে সাজানো যায়।


4
আমার অনুমান যে এটি Array<Int>সংকলন করে Integer[](যদি সংকলক এটি অনুকূল না করে)
মিবাক


হ্যাঁ, এটি প্রচুর অর্থবোধ করে, উভয়কে ধন্যবাদ!
এফআরআর

উত্তর:


111

Array<Int>Integer[]হুডের নীচে একটি , যখন IntArrayএকটি int[]। এটাই.

এর মানে হল যখন আপনি একটি করা Intএকটি ইন Array<Int>, এটা সবসময় boxed করা হবে (বিশেষত একটি সঙ্গে 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
এটা বেশ বোকা সিদ্ধান্ত। এ কারণে তাদের প্রতিটি আদিম ধরণের জন্য একটি নতুন শ্রেণি তৈরি করতে হয়েছিল ... তারা কেবল জাভা হিসাবে একই ব্যবহার করতে পারে।
অ্যান্ড্রয়েড বিকাশকারী

4
@ অ্যান্ড্রয়েড ডেভেলপার কী নতুন ক্লাস? int[]হয় IntArray, এবং আরও Integer[]কি Array<Int>, এই রহস্যময় নতুন ক্লাসটি কোথায়? এটি একই জিনিস কেবল সিনট্যাক্স ভিন্ন। int[]উপায় দ্বারা, বর্গ হয়।
ইউজেন পেচানেক

4
এই টুইটটি আকর্ষণীয়। তারা বলে যে এটি একটি শ্রেণি এবং এটির একটি উদাহরণ রয়েছে, তবে "এই শ্রেণীর উদাহরণগুলি অন্তর্নিহিত হিসাবে উপস্থাপন করা হয় []": কোটলিংলং.আর্গ / এপি / স্লেস্ট / জেভিএম / স্টাডলিব / কোটলিন/- int- array/… । সুতরাং, এই ফাংশনগুলি কি কেবল এক্সটেনশন ফাংশনগুলি হয়, বা সেগুলি প্রকৃত শ্রেণির হয়? এবং কেন এটি "ইনট্রে" এবং অন্যদের দরকার ছিল? এখনও জাভা সিনট্যাক্স ব্যবহার করে সম্পন্ন করা যেতে পারে।
অ্যান্ড্রয়েড বিকাশকারী

4
@ ইউজেনপ্যাচেনেক তবে জাভাতে, ইনট [] কোন ক্লাস নয়, নেই? এটি একটি অবজেক্ট, আদিম একটি অ্যারে। আপনি কোডটি পৌঁছাতে পারবেন না বা এটি থেকে প্রসারিত করতে পারবেন না। না? জাভাতে সমস্ত শ্রেণীর নামে একটি বড় অক্ষর রয়েছে have এখানে না।
অ্যান্ড্রয়েড বিকাশকারী

4
@ ইউজেনপ্যাচেনেক সুতরাং কোটলিনে এটি একটি শ্রেণি, যখন জাভাতে নেই। এখনও কেন পাবেন না। তারা কেবল এক্সটেনশন ফাংশন যোগ করতে পারে, না? আপনি সম্ভবত IntArray থেকে প্রসারিত করতে পারেন? নামকরণ সম্পর্কে, আমি জানি। এটি কেবল সম্মেলন, এবং একটি খুব ভাল।
অ্যান্ড্রয়েড বিকাশকারী 12

6

এটি লক্ষণীয় যে স্প্রেড ( *) অপারেটরটি একটি এ ব্যবহার করে একটি varargফিরে আসবে IntArray। আপনি একটি প্রয়োজন Array<Int>, আপনি আপনার রূপান্তর করতে পারেন IntArrayব্যবহার .toTypedArray()


1

কোটলিনে অ্যারেগুলি ক্লাস (জাভা জাতীয় "বিশেষ" নয়)।

কোটলিনের স্টিডলিব জাভা ভাষার সংহতকরণ এবং কার্যকারিতা উন্নত করতে JVM আদিম অ্যারেগুলির জন্য বিশেষ উদ্দেশ্যে ক্লাস সরবরাহ করে।

Array<T>বিদ্যমান জাভা কোডের সাথে মিশ্রণের সময় কোনও সমস্যা দেখা দেয় বা জাভা ক্লাস থেকে কল করা উচিত নয় তবে থাম্বের বিধিটি ব্যবহার করা হবে। রেকর্ডের জন্য, আমাকে কখনই ব্যবহার করতে হয়নি IntArray

আপনি এখানে এই বিষয়ে ভাষার ডকুমেন্টেশন চেক করতে পারেন: https://kotlinlang.org/docs/references/basic-tyype.html#arrays


আমি বিশ্বাস করি আপনি সর্বদা ইনআরে </ b> অ্যারে অনুগ্রহ করার বিষয়ে ঠিক বলেছেন, আমি বক্সিং / আনবক্সিং ওভারহেডকে বনাম টাইপ বনাম আদিম ব্যবহারের বিষয়ে উদ্বিগ্ন ছিলাম, তবে মনে হয় কোটলিন আবহাওয়ার সিদ্ধান্ত নিতে যথেষ্ট স্মার্ট, এটি কোনও আদিম ব্যবহার করতে পারে বা না । (আমি ভুল হলে আমাকে সংশোধন করুন) "জাভা প্ল্যাটফর্মে, নম্বরগুলি শারীরিকভাবে JVM আদিম ধরণের হিসাবে সংরক্ষণ করা হয়, যদি না আমাদের কোনও nallable নম্বর রেফারেন্সের প্রয়োজন হয় (উদাহরণস্বরূপ Int?) বা জেনেরিক জড়িত না হয়। পরবর্তী ক্ষেত্রে সংখ্যাগুলি বাক্সযুক্ত হয়।" কোটলিংলং.আর্গ
এফআরআর

@feresr না কোনো উপায়ে একটি বিশেষজ্ঞ, কিন্তু আমি মনে করি যে শুধুমাত্র বাস্তবায়নের উল্লেখ করা হয় Int, Floatইত্যাদি দেওয়া যে Kotlin জন্য একটি ভিন্ন ধরনের নেই Booleanবা boolean। অ্যারের ক্ষেত্রে, আমি ধরে নেব যে এর Array<Int>থেকে পৃথক হবে IntArray। আমি ব্যক্তিগতভাবে সর্বদা উত্তরকে ব্যবহার করেছি কারণ এটি কখনই আমাকে বিরক্ত করে না, তবে কোটলিনের অতিরিক্ত অপ্টিমাইজেশন রয়েছে যা সম্পর্কে আমি অবগত নই। আপনি যদি একমাত্র কোটলিনে প্রোগ্রামিং করছেন তবে আপনার অপরটির প্রয়োজনের কোনও ক্ষেত্রে আমি দেখতে পাচ্ছি না , তবে আদিম অ্যারেটির সুবিধাগুলি এখনও থাকতে পারে।
অ্যালান W

@ অ্যালানও হয় না বিশেষজ্ঞ, কেবল কৌতূহলী, আমি বিশ্বাস করি জাভাতে আদিম এবং বাক্সযুক্ত উভয় বস্তু রয়েছে কারণ আদিমদের সাথে কাজ করা আরও দক্ষ কারণ? অবশ্যই কখনও কখনও আপনাকে সত্যিকার অর্থে অবজেক্ট (ন্যুয়েবিলিটি / জেনারিকস) নিয়ে কাজ করা দরকার। এটি আমার আসল প্রশ্নের ক্ষেত্রের বাইরে চলে গেছে তবে আমি অবাক হই যে জেভিএমকে টার্গেট করার সময় কোটলিন কীভাবে এটি পরিচালনা করে। আমি যখনই সম্ভব ইনট্র্রে ব্যবহার করার চেষ্টা করব (এই ভেবে যে এটি হুডের নীচে আদিম ব্যবহার করছে) তবে @ জ্যামিং মন্তব্যের পরে আমি আর নিশ্চিত নই।
এফআরআর

4
আমার কাছে ফেয়ারার, কোটলিনের ডক্স স্পষ্টভাবে বলেছে যে বক্সিং ওভারহেড এড়াতে বিশেষ অ্যারের উদাহরণ রয়েছে। আমার গ্রহণযোগ্যতাটি হ'ল যে দুটি সম্ভবত আলাদা, এবং বিকাশকারীর শেষে আপনি জাভাতে পূর্ণসংখ্যক [] বা int [] ব্যবহার করতে চান কিনা তা সিদ্ধান্ত নেওয়ার মতো হয়ে যায়।
অ্যালান ডব্লিউ

আমি সম্মত হই, তবে গ্রহণযোগ্য উত্তরটি আগতদের জন্য বিভ্রান্তিকর হতে পারে, আমি এ কারণে এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করছি।
এফআরআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.