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)
配列とリスト(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の場合と同じです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加