回答:
配列とリスト(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>
はに対して不変であるT
(Array<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
アレイは、プリミティブのために最適化されていますが分離されIntArray
、DoubleArray
、CharArray
Javaプリミティブアレイにマッピングされる等(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の場合と同じです。
使用方法との主な違いは、配列はサイズ(Mutable)List
が固定されている一方でサイズを動的に調整できることです。さらにArray
、変更可能でList
はありませんが、変更可能です。
さらにkotlin.collections.List
、によって実装されたインターフェースもありますjava.util.ArrayList
。またkotlin.collections.MutableList
、アイテムの変更を可能にするコレクションが必要な場合に使用されるように拡張されています。
jvmレベルでArray
は、配列で表されます。List
一方java.util.List
、Javaでは同等の不変のコレクションがないため、で表されます。
val intArray = arrayOf(1,2,3); intArray[0] = 2
されませんval intList = listOf(1,2,3); intList[0] = 2
。List
確かに一定の大きさを持っていますが、MutableList
可能性があるので、しません延びているval a:List<Int>
異なる報告しますsize
以降の呼び出しで。
List
かArrayList
?
List
(おそらくケースの99%🙂)。実装の使用ArrayList
やLinkedList
その他の具体的な実装に関心がある場合。
Array
ですか?それだけが要素です-でも同じList
です。のサイズList
も固定です。