KotlinにおけるArrayList <String>()とmutableListOf <String>()の違い


99
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

どちらも変更可能なリストですが、2つのキーワードのmutableListOf意味はArrayList何ですか?

または大きな違いはありますか?


6
どちらmutableListOfArrayListキーワードはKotlinである
イリヤ

回答:


137

2つの違いは、意図を伝えることだけです。

と書くときはval a = mutableListOf()、「変更可能なリストが必要です。実装については特に気にしません」と言っています。代わりにval a = ArrayList()、あなたが書くときは、「私は特にArrayList

実際には、JVMにコンパイルするKotlinの現在の実装では、呼び出しmutableListOfによってが生成さArrayListれ、動作に違いはありません。リストが作成されると、すべてが同じように動作します。

さて、Kotlinの将来のバージョンではmutableListOf、異なるタイプのリストを返すように変更するとします。

ほとんどの場合、Kotlinチームは、新しい実装がほとんどのユースケースでより適切に機能すると判断した場合にのみ、その変更を行います。mutableListOf次に、その新しいリストの実装を透過的に使用してもらい、無料でそのより良い動作を取得します。mutableListOfそれがあなたのケースのように聞こえるなら、行きなさい。

一方、問題について考えるのにArrayList かなりの時間を費やし、それが本当に問題に最も適していると考え、最適でないものに移動するリスクを冒したくない場合があります。次にArrayList、直接使用するか、arrayListOfファクトリー関数(の-にArrayList類似したものmutableListOf)を使用する必要があります。


21

mutableListOf<T>()はを返すインライン関数呼び出しです MutableList<T>。今日の時点でmutableListOfは、のインスタンスが返されますArrayList

ArrayList<String>() コンストラクター呼び出しであり、インライン化できません。

言い換えれば、

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a タイプです MutableList<String>
  • b タイプです ArrayList<String>

実行時には、両方abのインスタンスを保持しますArrayList

組み合わせた場合にインライン化することは特に有用であることに留意されたい型具体化の存在を正当化、listOfmutableListOfなどが挙げられます。


1
したがって、違いはありません。
2017年

2
aそして、b異なる宣言された型を持っている-ので、コンパイル時に違いがあります。
miensol 2017年

次のようにインライン化できますval b = arrayListOf<String>()
Vlad

8

ソースで見ることができるように:

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

したがって、違いはなく、単に便利な方法です。


1
そして、私は「便利さ」を引用符で囲みます。MutableListの実装が実際に異なるまでは、別のコアオブジェクトと同じことを実行するコアオブジェクトを提供するのはややこしく、まったく便利ではありません。:(
マイクウィリアムソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.