2016-03-28 4 views
47

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) 

答えて

88

Arraysと(List<T>とそのサブタイプMutableList<T>によって表される)のリストは、ここでは、多くの違いを持っ​​ている最も重要なものは以下のとおりです。

  • Array<T>は、既知の実装を持つクラスである:それは、順次、固定サイズのメモリ領域ですアイテムを格納します(JVMではJava arrayと表示されます)。

    List<T>MutableList<T>が異なる実装有するインタフェースである:リストのArrayList<T>を、LinkedList<T>等のメモリ表現と動作ロジックは、例えば、具体的な実装で定義されていますLinkedList<T>のインデックス付けはリンクを通過し、O(n)時間かかるが、ArrayList<T>はそのアイテムを動的に割り当てられた配列に格納する。

    val list1: List<Int> = LinkedList<Int>() 
    val list2: List<Int> = ArrayList<Int>() 
    
  • Array<T>(それはread-only view of MutableList<T>又はimmutable list implementationのいずれかである)(それへの参照を介して変更することができる)可変であるが、List<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>addremoveの機能を持ち、サイズを増減することができます。

    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>MutableList<T>に対して同じ(Array<Int>Array<Number>ない)が、List<T>は共変である(List<Int>List<Number>ある)invariant on Tです。

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

  • List<T>MutableList<T>mapped typesあるとJavaの相互運用性(JavaのList<T>List<T>またはMutableList<T>どちらかとKotlinから見られている)での特別な行動を持っています。配列もマップされていますが、Javaの相互運用性はother rulesです。

  • 特定の配列型はannotations(プリミティブ配列、Array<String>、及びenum classエントリを有するアレイ)で使用され、特別なarray literal syntax for annotationsがありますされています。アノテーションでは、リストやその他のコレクションは使用できません。

  • 使用法に関しては、コードのパフォーマンス上重要な部分を除いて、配列全体にわたってリストを使用することをお勧めします。理由はthat for Javaと同じです。

10

利用側からの大きな違いはArraysが動的にサイズを調整することができ(Mutable)Listながら固定サイズを有することです。さらに、Arrayは変更可能ですが、Listは変更できません。

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

jvmレベルのArrayは、arraysで表されます。一方、Listjava.util.Listで表されます。これは、Javaで使用可能な不変なコレクションの同等物が存在しないためです。

+0

私は完全には納得していません。 'Array'では何が変更可能ですか?それだけが要素で、 'List'でも同じです。 'List'のサイズも固定されています。 – AndroidEx

+0

@AndroidEx以下は 'val intArray = arrayOf(1,2,3);をコンパイルします。 intArray [0] = 2'これは 'val intList = listOf(1,2,3);ではありません。 intList [0] = 2'。リストは実際には固定サイズですが、それを拡張する 'MutableList'はありません。したがって、' val a:List 'は後続の呼び出しで異なる' size'を返す可能性があります。 – miensol

+0

合意していただきありがとうございます – AndroidEx

関連する問題