Kotlinにおけるリストとmutablelistの違いの理解


私はimimabilityについて考えていました.私はほとんどこの画面を通してあなたの興奮を感じることができます!特に、私は調査して、あなたが故意に、または、無知に、Koltlinで不変性を破ることができる方法を学ぶようにしていました.私の最後の試みは、変更可能なリストを変更可能なリストに変更するために、変更可能なリストを変更可能なリストとしてキャストします.私が試みて失敗した間、私がしたいことの詳細で、私は何を作るかについてかなりおもしろい量を学びましたList Aと異なるMutableList , そして、私がここで学んだことについてもう少し共有します.

インタフェース、インタフェース、インタフェース
一瞥Kotlin’s documentation の違いについての良い概要を提供しますList 保存された要素への読み取り専用アクセスを提供します.MutableList 既存のリストから特定の要素を追加または削除できるようにする「リスト固有の書き込み操作」を提供します.私が興味を持ったのは、ドキュメントの最後の文です.

In Kotlin, the default implementation of List is ArrayList which you can think of as a resizable array.


うーん、エキサイティング!それでList 本当に単純なリストではないが、実際にはArrayList . 私たちはMutableList は単にArrayList , でしょう.私たちは仮定することができるか、我々は単に行くことができますし、どのように小林標準ライブラリを実際にこれらのことを実装確認します.
インパッケージkotlin.collections の定義を見ることができますList :
public interface List<out E> : Collection<E> { (...) }
List から継承するCollection そして、機能定義のシリーズを特徴としますget . Collection は、Iterable .
同じパッケージでは、定義を見ることができますMutableList :
public interface MutableList<E> : List<E>, MutableCollection<E> { (...) }
MutableList から継承するMutableCollection . MutableList 特長などの追加メソッドのシリーズadd and remove , 突然変異能力の付与MutableCollection から継承するCollection and MutableIterable , はIterator .
それ自体で、これは私たちに多くのことを知らせませんList and MutableList は基本的に2つの異なるインターフェイスで、読み込み専用メソッドで、もう一つは追加の書き込み固有のメソッドである.

関数、関数、関数
別の観点から見てみましょう.我々が起動するとき、何が起こりますかList() 例えば?起動List() 驚いたことにすぐにオブジェクトを開始しません.
@SinceKotlin("1.1")
@kotlin.internal.InlineOnly
public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init)
上記のスニペットから見るとList() 私たちは実際にはList , 上で見たインターフェイスですが、実際には別の関数を呼び出します.
@SinceKotlin("1.1")
@kotlin.internal.InlineOnly
public inline fun <T> MutableList(size: Int, init: (index: Int) -> T): MutableList<T> {
    val list = ArrayList<T>(size)
    repeat(size) { index -> list.add(init(index)) }
    return list
}
MutableList() 新規作成ArrayList , 適切な値で初期化してから戻ります.帰るとArrayList に変換されるMutableList . 私たちは明らかに、なぜKollinのドキュメントで、リストのデフォルトの実装がArrayList .
あなたの中の好奇心のために.ArrayList は、java.util.ArrayList :
@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
我々が行くならば、何を調べますかjava.util.ArrayList 実際に…それは拡張することが判明java.util.function.Consumer.AbstractList と実装java.util.List . ここでいくつかの接続を見始めています!

混合界面と機能
だから本質的にはList and MutableList つの別のものを一度にすることができます:
  • インターフェイスList 読み取り専用プロパティとMutableList 書き込み操作を行う.
  • に依存するインタフェースからオブジェクトをインスタンス化するために使用できる関数ArrayList 実際の実装.
  • もう1つのステップを取りましょうlistOf and mutableListOf . これらは何ですか.
    の1つでスニークピークを取りましょうlistOf 機能
    /**
     * Returns a new read-only list of given elements. The returned list is serializable (JVM).
     * @sample samples.collections.Collections.Lists.readOnlyList
     */
    public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
    
    私たちはvararg が配列listOf 基本的に配列の要素をリストに変換するList インターフェイス.mutableListOf 少し異なっていますが、本質的には同じです.
    /**
     * Returns a new [MutableList] with the given elements.
     * @sample samples.collections.Collections.Lists.mutableList
     */
    public fun <T> mutableListOf(vararg elements: T): MutableList<T> =
        if (elements.size == 0) ArrayList() else ArrayList(ArrayAsCollection(elements, isVarargs = true))
    
    上記の両方の場合、関数はArrayList しかし、これらは異なるインターフェースを返すList 読み取り専用操作のみを提供します.MutableList 書き込み操作も提供します.
    多分、私はKotlinのソースコードへの掘削の量を誇張したかもしれませんList and MutableList Kotlinの作品のいくつかの内部の魔法はまだ謎のビットかもしれないが、この探査で明確になった.