[解決済み】KotlinのList型とArray型の違いについて
質問
とはどのような違いがあるのでしょうか?
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>
などがあります。リストのメモリ表現と操作ロジックは具体的な実装で定義され、例えば、リスト内のインデックス付けは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>
は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 の場合 .
関連
-
[解決済み] Perl の配列を繰り返し処理する最適な方法
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaで配列をリストに変換する
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み] JavaScriptで2つの配列の差を取得する方法は?
-
[解決済み] 2つのリストの差を取得する
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSON スキーマで列挙型の配列を定義する正しい方法
-
[解決済み] Reactでオブジェクトの配列をマップする方法
-
[解決済み】Kotlinで配列を値で初期化する方法は?
-
[解決済み】Swiftで配列をシャッフルするにはどうすればいいですか?
-
[解決済み】Bashで配列の要素を別行動で表示する?
-
[解決済み】Swiftの配列で要素の合計を求める
-
[解決済み】Swiftを配列にセットする
-
[解決済み】要素を配列の先頭にプッシュする最も簡単な方法は何ですか?
-
[解決済み】配列/配列リストよりリンクリストを使用するのはいつ?
-
[解決済み】240以上の要素を持つ配列に対してループ処理を行うと、パフォーマンスに大きな影響があるのはなぜですか?