Kotlinのリスト型と配列型の違い


192

ListArrayタイプの違いは何ですか?
それらで同じ操作を行うことができるようです(ループ、フィルター式など)、動作や使用法に違いはありますか?

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

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

回答:


281

配列とリスト(List<T>とそのサブタイプで表されるMutableList<T>)には多くの違いがあります。最も重要なものを次に示します。

  • Array<T>既知の実装を持つクラスです。これは、アイテムを格納するシーケンシャルな固定サイズのメモリ領域です(JVMでは、Java配列で表されます)。

    List<T>MutableList<T>ArrayList<T>、実装が異なるインターフェースLinkedList<T>です。リストのメモリ表現と操作ロジックは、具体的な実装で定義されます。たとえば、aのインデックス付けLinkedList<T>はリンクを通過し、O(n)時間かかり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
  • 配列のサイズは固定されており、IDを保持して拡大または縮小することはできません(サイズを変更するには、配列をコピーする必要があります)。リストについて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>に対して不変であるTArray<Int>isではないArray<Number>)と同じですがMutableList<T>List<T>共変です(List<Int>is List<Number>)。

    val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
    val l: List<Number> = listOf(1, 2, 3) // OK
  • アレイは、プリミティブのために最適化されていますが分離されIntArrayDoubleArrayCharArrayJavaプリミティブアレイにマッピングされる等(int[]double[]char[])、しない箱入りものは(Array<Int>JavaのにマッピングされますInteger[])。一部のライブラリー(JDK以外)は、プリミティブに最適化されたリストを提供していますが、リストには一般にプリミティブ用に最適化された実装がありません。

  • List<T>およびMutableList<T>マップされたタイプであり、Javaの相互運用性で特別な動作をします(Java List<T>はKotlinからList<T>またはのどちらかと見なされますMutableList<T>)。配列もマッピングされますが、配列にはJavaの相互運用性に関する他の規則があります。

  • 特定の配列タイプが注釈(プリミティブ配列、、Array<String>およびenum classエントリを持つ配列)で使用され、注釈には特別な配列リテラル構文があります。リストおよびその他のコレクションは、注釈では使用できません。

  • 使用方法に関しては、コードのパフォーマンスが重要な部分を除き、あらゆる場所で配列よりもリストを使用することをお勧めします。理由はJavaの場合と同じです。


26

使用方法との主な違いは、配列はサイズ(Mutable)Listが固定されている一方でサイズを動的に調整できることです。さらにArray、変更可能でListはありませんが、変更可能です。

さらにkotlin.collections.List、によって実装されたインターフェースもありますjava.util.ArrayList。またkotlin.collections.MutableList、アイテムの変更を可能にするコレクションが必要な場合に使用されるように拡張されています。

jvmレベルでArrayは、配列で表されますList一方java.util.List、Javaでは同等の不変のコレクションがないため、で表されます。


私はここで完全には確信していません。何が変更可能Arrayですか?それだけが要素です-でも同じListです。のサイズListも固定です。
AndroidEx 2016年

1
@AndroidEx以下はコンパイルされますが、コンパイルval intArray = arrayOf(1,2,3); intArray[0] = 2されませんval intList = listOf(1,2,3); intList[0] = 2List確かに一定の大きさを持っていますが、MutableList可能性があるので、しません延びているval a:List<Int>異なる報告しますsize以降の呼び出しで。
miensol 2016年

使用することをお勧めしますListArrayList
IgorGanapolsky

2
@IgorGanapolsky具体的な実装の使用を気にしない場合List(おそらくケースの99%🙂)。実装の使用ArrayListLinkedListその他の具体的な実装に関心がある場合。
miensol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.