KotlinのListとSetとMapの違いと使い方について

採用はこちら

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つのインターフェースがあります。

  • 読み取り専用コレクション
  • 変更可能コレクション
読み取り専用変更可能
ListMutableList
SetMutableSet
MapMutableMap

重要なポイントは、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の違いと使い方についてでした。

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

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