Kotlin'de Liste ve Dizi Türleri Arasındaki Fark


192

ListVe Arraytürleri arasındaki fark nedir ?
Görünüşe göre onlarla aynı işlemleri yapabilir (döngüler, filtre ifadesi vb.), Davranış veya kullanımda herhangi bir fark var mı?

val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")

for (name in names1)
    println(name)
for (name in names2)
    println(name)

Yanıtlar:


282

Diziler ve listeler ( List<T>ile ve alt türü ile temsil edilir MutableList<T>) birçok farklılığa sahiptir, en önemlileri şunlardır:

  • Array<T>bilinen bir uygulamaya sahip bir sınıftır: öğeleri depolayan sıralı sabit boyutlu bir bellek bölgesidir (ve JVM'de Java dizisi ile temsil edilir ).

    List<T>ve MutableList<T>: farklı uygulamaları var arayüzleri vardır ArrayList<T>, LinkedList<T>listelerin mantığı beton uygulanması, örneğin tanımlanır vb Bellek gösterimi ve operasyonlar bir de indeksleme LinkedList<T>linkleri geçer ve oysa O (n) zaman alır ArrayList<T>bir dinamik olarak ayrılan dizide kendi ürün mağazalarında.

    val list1: List<Int> = LinkedList<Int>()
    val list2: List<Int> = ArrayList<Int>()
  • Array<T>değişkendir (herhangi bir referansla değiştirilebilir), ancak List<T>değiştirme yöntemlerine sahip değildir ( salt okunur görünümMutableList<T> veya değişmez liste uygulamasıdır ).

    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
  • Diziler sabit boyuta sahiptir ve tutma kimliğini genişletemez veya daraltamaz (yeniden boyutlandırmak için bir diziyi kopyalamanız gerekir). Listelere, MutableList<T>sahip addve removeişlevlere gelince, boyutunu artırabilir ve azaltabilir.

    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>olduğu invaryantT ( Array<Int>değildir Array<Number>) aynı MutableList<T>fakat List<T>(bildirdiğinden olduğu List<Int>bir List<Number>).

    val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
    val l: List<Number> = listOf(1, 2, 3) // OK
  • Diziler ilkel için optimize edilmiştir: orada ayrı IntArray, DoubleArray, CharArrayJava ilkel diziler eşlemlendiği vb ( int[], double[], char[]) değil, kutulu olanlar ( Array<Int>Java'nın eşleştirilir Integer[]). Listeler genel olarak ilkel öğeler için optimize edilmiş uygulamalara sahip değildir, ancak bazı kütüphaneler (JDK dışında) ilkel olarak optimize edilmiş listeler sağlar.

  • List<T>ve MutableList<T>edilir türlerini eşlenen ve Java entegre edilmesi konusunda özel bir davranış (Java en sahip List<T>olarak ya KOTLIN görüldüğü List<T>ya MutableList<T>). Diziler de eşlenir, ancak Java'nın birlikte çalışabilirliği için başka kuralları vardır .

  • Bazı dizi türleri ek açıklamalarda (ilkel diziler Array<String>ve enum classgirişli diziler ) kullanılır ve ek açıklamalar için özel bir dizi değişmez sözdizimi vardır . Listeler ve diğer koleksiyonlar ek açıklamalarda kullanılamaz.

  • Kullanımla ilgili olarak, iyi bir uygulama, kodunuzun performans açısından kritik bölümleri hariç, her yerde diziler üzerinde listeler kullanmayı tercih etmektir, gerekçe Java ile aynıdır .


26

Kullanım tarafındaki en büyük fark, dizilerin(Mutable)List boyutlarını dinamik olarak ayarlayabilmeleri için sabit bir boyuta sahip olmalarıdır. Üstelik Arraydeğişebilirken Listdeğil.

Ayrıca kotlin.collections.List, diğerleri tarafından uygulanan bir arayüzdür java.util.ArrayList. Ayrıca kotlin.collections.MutableList, öğe değişikliğine izin veren bir koleksiyon gerektiğinde kullanılmak üzere genişletilir .

Jvm düzeyinde dizilerleArray temsil edilir . Öte yandan Java'da değişmez koleksiyon eşdeğeri olmadığından temsil edilmektedir .Listjava.util.List


Burada tam olarak ikna olmadım. Değişebilen nedir Array? Sadece öğeleri - aynı şey List. Boyutu Listda sabittir.
AndroidEx

1
@AndroidEx aşağıdakiler derlenecek, val intArray = arrayOf(1,2,3); intArray[0] = 2ancak bu derlenmeyecektir val intList = listOf(1,2,3); intList[0] = 2. ListGerçekten sabit bir boyutu var ama MutableListo dolayısıyla bir olasıdır gelmez uzanan val a:List<Int>farklı rapor verecek sizesonraki çağrılarda.
miensol

ListVeya kullanılması önerilir ArrayListmi?
IgorGanapolsky

2
@IgorGanapolsky Somut uygulama kullanımı ile ilgilenmiyorsanız List(muhtemelen vakaların% 99'u 🙂). Uygulama kullanımı ArrayListveya LinkedListbaşka bir somut uygulama ile ilgileniyorsanız.
miensol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.