1. ホーム

[解決済み】KotlinのList型とArray型の違いについて

2022-04-04 12:38:09

質問

とはどのような違いがあるのでしょうか? 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)

解決方法は?

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

  • Array<T> は、実装がわかっているクラスで、アイテムを格納するシーケンシャルな固定サイズのメモリ領域です(JVM上では、これは Java配列 ).

    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> はミュータブル(その参照を通じて変更可能)ですが 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> があります。 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> の不変量 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
    
    
  • 配列はプリミティブに最適化されています。 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 の場合 .