web-dev-qa-db-ja.com

Scalaコレクションでの可変性と不変性

私はScalaにかなり慣れており、コレクションの階層を理解しようとしています。「ミュータブル」コレクションと「イミュータブル」コレクションには違いがあるようですが、これが実際に何を理解していないのですか?実装レベルでこれがvalvarにどのように関係するかを意味します。誰もがこれについて何らかの洞察を与えることはできますか?また、すべてのコレクションクラスには「可変」バージョンと「不変」がありますバージョン、または「ミュータブル」または「イミュータブル」にしかできないクラスはありますか?

41
astay13

ミュータブルとは、コレクションをインプレースで変更できることを意味します。したがって、コレクションcがあり、要素に+=を追加すると、cが変更され、そのコレクションへの他のすべての参照も変更されます。

不変とは、コレクションオブジェクトが変更されないことを意味します。代わりに、+++などの操作を使用して新しいコレクションオブジェクトを作成します。これにより、新しいコレクションが返されます。これは、コレクションに何かを追加するためにロックする必要がないため、並行アルゴリズムで役立ちます。オーバーヘッドが発生する可能性がありますが、このプロパティは非常に役立ちます。 Scalaの不変コレクションは 完全に永続的なデータ構造 です。

違いはvarvalの違いとよく似ていますが、次の点に注意してください。

  1. valにバインドされた変更可能なコレクションを変更できますが、valを再割り当てすることはできません
  2. 不変コレクションをインプレースで変更することはできませんが、varに割り当てられている場合は、そのvarを、+などの操作によって作成されたコレクションに再度割り当てることができます。

すべてのコレクションが必ずしも可変で不変のバリアントで存在するわけではありません。前回チェックしたときは、変更可能な優先度キューのみがサポートされていました。

61
Fred Foo

不変とは、変更できないことを意味します。 valは参照を変更不可能にします。つまり、一度初期化されたvalに値を割り当てることはできません。不変コレクションは、コレクションへの参照ではなく、コレクション自体を変更不可能にします。不変コレクションを変更するたびに、元のコレクションをインプレースで変更する代わりに、別のコレクションが作成されます。ほとんどのコレクションには不変バージョンと可変バージョンの両方がありますが、もちろん例外があります。

7
agilesteel