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)
ベストアンサー1
配列およびリスト(List<T>
およびそのサブタイプMutableList<T>
) には多くの違いがありますが、最も重要なものは次のとおりです。
Array<T>
は既知の実装を持つクラスです。これは、アイテムを格納する連続した固定サイズのメモリ領域です(JVMでは次のように表されます)。Java配列)。List<T>
および は、など、MutableList<T>
異なる実装を持つインターフェースです。リストのメモリ表現と操作ロジックは具体的な実装で定義されます。たとえば、 でのインデックス作成はリンクを経由するため O(n) 時間がかかりますが、 ではその項目を動的に割り当てられた配列に格納します。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>
は共変です (List<Int>
は ですList<Number>
)。val a: Array<Number> = Array<Int>(0) { 0 } // won't compile val l: List<Number> = listOf(1, 2, 3) // OK
配列はプリミティブに最適化されています。Javaプリミティブ配列( 、、)にマッピングされる個別の、などが
IntArray
ありますDoubleArray
。CharArray
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の場合。