Kotlinでは、複数のデータをまとめて扱うために コレクション(Collection) が使われます。
その中でも特に重要なのが次の3種類です。
- List
- Set
- Map
これらはそれぞれデータの管理方法や用途が異なります。
まずは全体の違いを整理してから、具体的な使い方を解説します。
List・Set・Mapの基本的な違い
| コレクション | 特徴 | 重複 | 順序 | キー |
|---|---|---|---|---|
| List | 順序を持つコレクション | 可能 | あり | なし |
| Set | 重複を許さない集合 | 不可 | 実装による | なし |
| Map | キーと値のペア | キーは不可 | 実装による | あり |
簡単にイメージすると次のようになります。
List
["apple", "banana", "apple"]
Set
{"apple", "banana"}
Map
{"apple" -> 100, "banana" -> 200}
Kotlinのコレクションの設計
Kotlinのコレクションには2つのインターフェースがあります。
- 読み取り専用コレクション
- 変更可能コレクション
| 読み取り専用 | 変更可能 |
|---|---|
| List | MutableList |
| Set | MutableSet |
| Map | MutableMap |
重要なポイントは、List / Set / Map は「完全な不変コレクション」ではなく「読み取り専用インターフェース」であるという点です。
つまり
Listからはadd()などの変更操作を呼び出せない- ただし、背後のコレクションが変更される可能性はある
という設計になっています。
List
Listの特徴
Listは、順序を持つコレクションです。
主な特徴は次の通りです。
- 要素の順番が保持される
- 同じ値を複数入れられる
- インデックスでアクセスできる
Listの作成
読み取り専用List
val fruits = listOf("apple", "banana", "orange")
変更可能List
val fruits = mutableListOf("apple", "banana")
要素の取得
Listではインデックスで要素を取得できます。
val fruits = listOf("apple", "banana", "orange")
println(fruits[0])
println(fruits.get(1))
出力
apple
banana
要素の追加と削除
val fruits = mutableListOf("apple", "banana")
fruits.add("orange")
fruits.remove("banana")
println(fruits)
出力
[apple, orange]
ループ処理
val fruits = listOf("apple", "banana", "orange")
for (fruit in fruits) {
println(fruit)
}
よく使うList操作
map
各要素を変換する処理です。
val numbers = listOf(1, 2, 3)
val doubled = numbers.map { it * 2 }
println(doubled)
結果
[2, 4, 6]
filter
条件に一致する要素だけ取得します。
val numbers = listOf(1, 2, 3, 4, 5)
val even = numbers.filter { it % 2 == 0 }
println(even)
結果
[2, 4]
Listを使う場面
Listは順番を持つデータを扱うときに適しています。
例
- 商品一覧
- 記事一覧
- コメント履歴
- 検索結果
Set
Setの特徴
Setは、重複を許さないコレクションです。
特徴は次の通りです。
- 同じ要素は1つしか保持されない
- 要素の存在チェックに向いている
- インデックスアクセスは基本的に行わない
なお、Setの反復順序は実装に依存します。
挿入順が保持される場合もありますが、順序を前提に処理を書くべきではありません。
Setの作成
読み取り専用Set
val fruits = setOf("apple", "banana", "apple")
重複した値は自動的に排除されます。
結果
[apple, banana]
変更可能Set
val fruits = mutableSetOf("apple", "banana")
fruits.add("orange")
fruits.add("apple")
println(fruits)
結果
[apple, banana, orange]
要素存在チェック
Setは存在チェックに適しています。
val fruits = setOf("apple", "banana")
println("apple" in fruits)
結果
true
集合演算
Setでは数学の集合演算が使えます。
和集合
val a = setOf(1,2,3)
val b = setOf(3,4,5)
println(a union b)
結果
[1,2,3,4,5]
積集合
println(a intersect b)
結果
[3]
差集合
println(a subtract b)
結果
[1,2]
Setを使う場面
- タグ管理
- ユニークIDの管理
- 重複データの排除
Map
Mapの特徴
Mapは、キーと値のペアを管理するコレクションです。
特徴は次の通りです。
- キーは重複できない
- 値は重複可能
- キーを使って値を取得できる
Mapの作成
読み取り専用Map
val prices = mapOf(
"apple" to 100,
"banana" to 200
)
変更可能Map
val prices = mutableMapOf(
"apple" to 100
)
prices["banana"] = 200
値の取得
val prices = mapOf(
"apple" to 100,
"banana" to 200
)
println(prices["apple"])
結果
100
ループ処理
for ((key, value) in prices) {
println("$key : $value")
}
結果
apple : 100
banana : 200
Mapの変換
val prices = mapOf(
"apple" to 100,
"banana" to 200
)
val taxPrices = prices.mapValues { it.value * 1.1 }
println(taxPrices)
この処理では、値が Double 型になります。
Mapを使う場面
Mapは、キーから値を検索する用途に適しています。
例
- ユーザーID → ユーザー情報
- 商品ID → 価格
- 設定キー → 設定値
List・Set・Mapの使い分け
| コレクション | 用途 |
|---|---|
| List | 順序付きデータ |
| Set | 重複排除 |
| Map | キー検索 |
簡単な覚え方
- List → 順序付きデータ
- Set → 重複なし集合
- Map → キーと値の対応
Kotlinコレクションの実装について
Kotlinの listOf() や setOf() などの関数は、内部的に効率的な実装を返します。
JVM環境では
- ArrayList
- LinkedHashSet
- LinkedHashMap
などが使われることが多いですが、具体的な実装クラスに依存したコードを書くべきではありません。
まとめ
Kotlinのコレクションは、用途によって使い分けることが重要です。
- List
順序を持つデータを扱う - Set
重複を排除する - Map
キーから値を取得する
この3つの特徴を理解しておくと、Kotlinのデータ処理の多くを効率よく書けるようになります。
以上、KotlinのListとSetとMapの違いと使い方についてでした。
最後までお読みいただき、ありがとうございました。










