কোটলিনে তালিকা এবং অ্যারের প্রকারের মধ্যে পার্থক্য


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)

উত্তর:


279

অ্যারে এবং তালিকাগুলি (এর প্রতিনিধিত্ব করে List<T>এবং এর উপপ্রকার MutableList<T>) এর মধ্যে অনেক পার্থক্য রয়েছে, এখানে সর্বাধিক তাৎপর্যপূর্ণ রয়েছে:

  • Array<T>এটি জ্ঞাত বাস্তবায়ন সহ একটি শ্রেণি: এটি আইটেমগুলি সংরক্ষণ করে একটি ক্রমযুক্ত নির্দিষ্ট আকারের মেমরি অঞ্চল (এবং জেভিএম এ এটি জাভা অ্যারে দ্বারা উপস্থাপন করা হয় )।

    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
  • অ্যারেগুলির আকার স্থির থাকে এবং ধরে রাখার পরিচয়টি প্রসারিত বা সঙ্কুচিত করতে পারে না (এটির আকার পরিবর্তন করতে আপনাকে কোনও অ্যারে অনুলিপি করতে হবে)। তালিকাগুলি, 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>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>করছে ধরনের ম্যাপ এবং জাভা ইনটেরোপিরাবিলিটি বিশেষ আচরণ (জাভার আছে List<T>যেমন পারেন Kotlin থেকে দেখা যায় List<T>বা MutableList<T>)। অ্যারেগুলিকেও ম্যাপ করা হয়েছে তবে জাভা আন্তঃক্রিয়াশীলতার তাদের অন্যান্য নিয়ম রয়েছে।

  • কিছু অ্যারে ধরনের ব্যবহার করা হয় টীকা (আদিম অ্যারে, Array<String>, এবং অ্যারে enum classএন্ট্রি), এবং সেখানে একটি বিশেষত্ব আছে টীকা জন্য অ্যারের আক্ষরিক সিনট্যাক্স । তালিকা এবং অন্যান্য সংগ্রহগুলি টীকায় ব্যবহার করা যাবে না।

  • ব্যবহার হিসাবে, ভাল অনুশীলন হ'ল আপনার কোডের পারফরম্যান্সের সমালোচনামূলক অংশগুলি বাদে সর্বত্র অ্যারেগুলির উপরে তালিকা ব্যবহার করা পছন্দ করা, যুক্তি জাভা হিসাবে একই ।


26

ব্যবহারের দিক থেকে প্রধান পার্থক্য হ'ল অ্যারেগুলির একটি নির্দিষ্ট আকার থাকে এবং (Mutable)Listতাদের আকারটি গতিশীলভাবে সামঞ্জস্য করতে পারে। তাছাড়া Arrayচপল যেহেতু হয় Listনয়।

তদ্ব্যতীত kotlin.collections.Listঅন্যদের মধ্যে প্রয়োগ করা একটি ইন্টারফেস java.util.ArrayListkotlin.collections.MutableListআইটেম সংশোধন করার অনুমতি দেয় এমন কোনও সংগ্রহ প্রয়োজন হলে এটি ব্যবহারের দ্বারাও বাড়ানো হয় ।

Jvm স্তরে অ্যারেArray দ্বারা প্রতিনিধিত্ব করা হয় । অন্যদিকে জাভাতে কোনও অবিচ্ছেদ্য সংগ্রহ সমতুল্য নেই বলে উপস্থাপন করা হয় ।Listjava.util.List


আমি এখানে পুরোপুরি নিশ্চিত নই। কি মধ্যে পরিবর্তনযোগ্য Array? শুধু এটা উপাদান নেই - একই List। এর আকারও Listস্থির।
অ্যান্ড্রয়েডএক্স

1
নিম্নলিখিতটি অ্যান্ড্রয়েডেক্স সংকলন করবে val intArray = arrayOf(1,2,3); intArray[0] = 2যখন এটি না করবে val intList = listOf(1,2,3); intList[0] = 2Listপ্রকৃতপক্ষে একটি নির্দিষ্ট আকার আছে কিন্তু MutableListযা প্রসারিত এটা না অত: পর এটিও সম্ভব হতে পারে একটি val a:List<Int>বিভিন্ন রিপোর্ট হবে sizeপরবর্তী কল।
মিনসোল

এটি ব্যবহার করার পরামর্শ দেওয়া হয় Listবা ArrayList?
ইগোরগানাপলস্কি 21

2
@ আইগরগানাপলস্কি যদি আপনি কংক্রিট বাস্তবায়ন ব্যবহারের বিষয়ে চিন্তা না করেন List(সম্ভবত 99% ক্ষেত্রে cases)। আপনি যদি প্রয়োগের ব্যবহার ArrayListবা LinkedListঅন্য কোনও কংক্রিট বাস্তবায়ন সম্পর্কে যত্ন নেন।
মিনসোল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.