Kotlinでは、複数のデータをまとめて扱うために コレクション(Collection) が用意されています。
その中でも最もよく使われるのが List と MutableList です。
どちらも 順序付きのコレクション(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の違い
| 項目 | List | MutableList |
|---|---|---|
| 変更 | 不可 | 可能 |
| 追加 | × | 〇 |
| 削除 | × | 〇 |
| 更新 | × | 〇 |
| 用途 | データ参照 | データ操作 |
型の関係
MutableList は List を拡張したインターフェースです。
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の List と MutableList の違いは次の通りです。
| 項目 | List | MutableList |
|---|---|---|
| 変更 | 不可 | 可能 |
| 役割 | 読み取り専用 | 変更可能 |
| 主用途 | データ参照 | データ操作 |
| 型関係 | 親インターフェース | 子インターフェース |
Kotlinのコレクション設計の重要なポイントは「変更可能性を型で管理する」という考え方です。
そのため実務では
- 外部公開 → List
- データ操作 → MutableList
という使い分けがよく行われます。
以上、KotlinのListとMutableListについてでした。
最後までお読みいただき、ありがとうございました。










