KotlinのListとMutableListについて

採用はこちら

Kotlinでは、複数のデータをまとめて扱うために コレクション(Collection) が用意されています。

その中でも最もよく使われるのが ListMutableList です。

どちらも 順序付きのコレクション(Ordered Collection) ですが、最大の違いは 要素を変更できるかどうか にあります。

Kotlinは安全性を高めるために、コレクションを 「読み取り専用」と「変更可能」 に分けて設計しています。

この記事では、以下の内容を順番に解説します。

  • Kotlinコレクションの基本設計
  • List(読み取り専用リスト)
  • MutableList(変更可能リスト)
  • ListとMutableListの違い
  • 相互変換
  • 実務での使い分け
  • Kotlinコレクションでよくある誤解
目次

Kotlinのコレクション設計

Kotlinのコレクションは大きく次の2種類に分かれます。

種類特徴
List読み取り専用
MutableList変更可能

Javaでは List は1種類しかありませんが、Kotlinでは 変更可能性(Mutability)を型で分離しています。

これにより

  • 不要なデータ変更を防ぐ
  • APIの安全性を高める
  • バグの発生を減らす

というメリットがあります。

List

List読み取り専用のインターフェースです。

つまり、要素を 参照することはできますが変更はできません

Listの作成

val numbers = listOf(1, 2, 3)

listOf()読み取り専用の List を生成する関数です。

Listでできる操作

Listでは主に 参照系の操作が可能です。

要素取得

println(numbers[0])

サイズ取得

println(numbers.size)

ループ処理

for (n in numbers) {
    println(n)
}

contains

println(numbers.contains(2))

高階関数

KotlinのListでは、関数型操作が豊富に用意されています。

val numbers = listOf(1,2,3,4)

val result = numbers
    .filter { it % 2 == 0 }
    .map { it * 10 }

println(result)

結果

[20, 40]

Listでできない操作

Listでは次のような 変更操作はできません

val list = listOf(1,2,3)

list.add(4)
list.remove(1)
list[0] = 10

これらはすべて コンパイルエラーになります。

MutableList

MutableList要素の追加・削除・更新が可能なリストです。

作成

val numbers = mutableListOf(1,2,3)

要素追加

numbers.add(4)

結果

[1,2,3,4]

要素削除

numbers.remove(2)

結果

[1,3,4]

要素更新

numbers[0] = 100

結果

[100,3,4]

指定位置に追加

numbers.add(1, 200)

結果

[100,200,3,4]

全削除

numbers.clear()

ListとMutableListの違い

項目ListMutableList
変更不可可能
追加×
削除×
更新×
用途データ参照データ操作

型の関係

MutableListList を拡張したインターフェースです。

MutableList : List

そのため、次のコードは成立します。

val list: List<Int> = mutableListOf(1,2,3)

しかし逆はできません。

val list = listOf(1,2,3)

val mutable: MutableList<Int> = list

これは 型の安全性のためコンパイルエラーになります。

ListとMutableListの変換

MutableListへ変換

val list = listOf(1,2,3)

val mutable = list.toMutableList()

Listとして扱う

val mutable = mutableListOf(1,2,3)

val list = mutable.toList()

toList()List型として扱うための変換として利用されます。

KotlinのListはimmutableではない

Kotlinの List完全なイミュータブル(不変)コレクションではありません

あくまで 読み取り専用インターフェースです。

例えば次のコードを見てください。

val mutable = mutableListOf(1,2,3)

val list: List<Int> = mutable

mutable.add(4)

println(list)

出力

[1,2,3,4]

このように

  • list から変更はできない
  • しかし 実体がMutableListなら変更される

という特徴があります。

実務での使い分け

実務では次の考え方がよく使われます。

変更しないデータ

fun getUsers(): List<User>

理由

  • 呼び出し側が変更できない
  • APIの安全性が高い

変更が必要なデータ

val users = mutableListOf<User>()

Kotlinの基本方針

Kotlinでは一般的に次の方針が推奨されます。

可能な限りListを使う
変更が必要な場合だけMutableListを使う

これにより

  • 不要な状態変更を防げる
  • コードの安全性が高くなる

まとめ

Kotlinの ListMutableList の違いは次の通りです。

項目ListMutableList
変更不可可能
役割読み取り専用変更可能
主用途データ参照データ操作
型関係親インターフェース子インターフェース

Kotlinのコレクション設計の重要なポイントは「変更可能性を型で管理する」という考え方です。

そのため実務では

  • 外部公開 → List
  • データ操作 → MutableList

という使い分けがよく行われます。

以上、KotlinのListとMutableListについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次