Scalaのコレクションフレームワークにおける「可変(mutable)」と「不変(immutable)」の違いは、コレクションの内容を変更できるかどうかという点にあります。Scalaでは関数型プログラミングの理念に則り、不変コレクションが推奨されており、標準ライブラリには両方のバージョンが用意されています。
1. 不変(Immutable)コレクション
概要:
不変コレクションは、一度作成すると内容を変更できないコレクションです。要素を追加・削除・更新しようとすると、新しいコレクションが返され、元のコレクションは変更されません。
特徴:
-
スレッドセーフ:複数スレッドから同時にアクセスしても安全。
-
元のデータが保たれるため、状態変化に伴うバグを防ぎやすい。
-
関数型プログラミングと親和性が高い。
例:
2. 可変(Mutable)コレクション
概要:
可変コレクションは、内容を直接変更できるコレクションです。要素の追加・削除・更新がその場で反映されます。
特徴:
-
パフォーマンスに優れる場面もある(特に大規模な変更が頻繁に行われる場合)。
-
命令型スタイルのコードでよく使用される。
-
スレッドセーフではないため、マルチスレッド環境では注意が必要。
例:
3. パッケージ構成
Scalaでは、同じ種類のコレクションでも以下のように明確に区別されています。
| 種類 | パッケージ | 使用例 |
|---|---|---|
| 不変コレクション | scala.collection.immutable |
List, Map, Set など |
| 可変コレクション | scala.collection.mutable |
ListBuffer, ArrayBuffer, HashMap など |
4. 選択の指針
| 条件 | 推奨されるコレクション |
|---|---|
| 並列処理やスレッドセーフ性が求められる | 不変コレクション |
| データの変更頻度が高く、性能が重要である場合 | 可変コレクション |
| 関数型プログラミングスタイルを志向している場合 | 不変コレクション |
まとめ
| 項目 | 不変(immutable) | 可変(mutable) |
|---|---|---|
| 内容の変更 | 不可(新しいインスタンスを生成) | 可能(その場で変更) |
| スレッドセーフ性 | 高い | 低い(同期処理が必要) |
| パフォーマンス | 状況による | 高頻度の更新に適している |
| 利用シーン | 関数型、共有状態のないコード | 状態変更が多い処理 |
生成日:2025/05/04