可変(mutable)と不変(immutable)の違い

Scalaのコレクションフレームワークにおける「可変(mutable)」と「不変(immutable)」の違いは、コレクションの内容を変更できるかどうかという点にあります。Scalaでは関数型プログラミングの理念に則り、不変コレクションが推奨されており、標準ライブラリには両方のバージョンが用意されています。


1. 不変(Immutable)コレクション

概要:

不変コレクションは、一度作成すると内容を変更できないコレクションです。要素を追加・削除・更新しようとすると、新しいコレクションが返され、元のコレクションは変更されません。

特徴:

  • スレッドセーフ:複数スレッドから同時にアクセスしても安全。

  • 元のデータが保たれるため、状態変化に伴うバグを防ぎやすい。

  • 関数型プログラミングと親和性が高い

例:

scala
val immutableList = List(1, 2, 3) val newList = immutableList :+ 4 // 新しいリストを生成 // immutableListは変化しない

2. 可変(Mutable)コレクション

概要:

可変コレクションは、内容を直接変更できるコレクションです。要素の追加・削除・更新がその場で反映されます。

特徴:

  • パフォーマンスに優れる場面もある(特に大規模な変更が頻繁に行われる場合)。

  • 命令型スタイルのコードでよく使用される

  • スレッドセーフではないため、マルチスレッド環境では注意が必要。

例:

scala
import scala.collection.mutable.ListBuffer val mutableList = ListBuffer(1, 2, 3) mutableList += 4 // リストに直接追加 // mutableListは変更される

3. パッケージ構成

Scalaでは、同じ種類のコレクションでも以下のように明確に区別されています。

種類 パッケージ 使用例
不変コレクション scala.collection.immutable List, Map, Set など
可変コレクション scala.collection.mutable ListBuffer, ArrayBuffer, HashMap など

4. 選択の指針

条件 推奨されるコレクション
並列処理やスレッドセーフ性が求められる 不変コレクション
データの変更頻度が高く、性能が重要である場合 可変コレクション
関数型プログラミングスタイルを志向している場合 不変コレクション

まとめ

項目 不変(immutable) 可変(mutable)
内容の変更 不可(新しいインスタンスを生成) 可能(その場で変更)
スレッドセーフ性 高い 低い(同期処理が必要)
パフォーマンス 状況による 高頻度の更新に適している
利用シーン 関数型、共有状態のないコード 状態変更が多い処理

生成日:2025/05/04