私はScalaにかなり慣れており、コレクションの階層を理解しようとしています。「ミュータブル」コレクションと「イミュータブル」コレクションには違いがあるようですが、これが実際に何を理解していないのですか?実装レベルでこれがval
とvar
にどのように関係するかを意味します。誰もがこれについて何らかの洞察を与えることはできますか?また、すべてのコレクションクラスには「可変」バージョンと「不変」がありますバージョン、または「ミュータブル」または「イミュータブル」にしかできないクラスはありますか?
ミュータブルとは、コレクションをインプレースで変更できることを意味します。したがって、コレクションc
があり、要素に+=
を追加すると、c
が変更され、そのコレクションへの他のすべての参照も変更されます。
不変とは、コレクションオブジェクトが変更されないことを意味します。代わりに、+
や++
などの操作を使用して新しいコレクションオブジェクトを作成します。これにより、新しいコレクションが返されます。これは、コレクションに何かを追加するためにロックする必要がないため、並行アルゴリズムで役立ちます。オーバーヘッドが発生する可能性がありますが、このプロパティは非常に役立ちます。 Scalaの不変コレクションは 完全に永続的なデータ構造 です。
違いはvar
とval
の違いとよく似ていますが、次の点に注意してください。
val
にバインドされた変更可能なコレクションを変更できますが、val
を再割り当てすることはできませんvar
に割り当てられている場合は、そのvar
を、+
などの操作によって作成されたコレクションに再度割り当てることができます。すべてのコレクションが必ずしも可変で不変のバリアントで存在するわけではありません。前回チェックしたときは、変更可能な優先度キューのみがサポートされていました。
不変とは、変更できないことを意味します。 val
は参照を変更不可能にします。つまり、一度初期化されたval
に値を割り当てることはできません。不変コレクションは、コレクションへの参照ではなく、コレクション自体を変更不可能にします。不変コレクションを変更するたびに、元のコレクションをインプレースで変更する代わりに、別のコレクションが作成されます。ほとんどのコレクションには不変バージョンと可変バージョンの両方がありますが、もちろん例外があります。