2011-11-27 10 views
30

Sono abbastanza nuovo in Scala e sto cercando di capire la gerarchia delle collezioni. Vedo che c'è una distinzione tra collezioni "mutabili" e "immutabili", ma non capisco cosa questo significhi realmente a livello di implementazione e in che modo si riferisce a val e var. Qualcuno può darmi qualche idea su questo? Inoltre, ogni classe di collezione ha una versione 'mutabile' e una versione 'immutabile', o ci sono alcune classi che possono essere solo 'mutabili' o 'immutabili'?mutable vs. immutable nelle collezioni Scala

risposta

50

Mutabile significa che è possibile modificare la raccolta sul posto. Quindi, se si dispone di una collezione c e si aggiunge un elemento con +=, allora c è stato modificato e così ogni altro riferimento a tale raccolta.

Immutabile significa che l'oggetto di raccolta non cambia mai; invece, si creano nuovi oggetti di raccolta con operazioni come + o ++, che restituiscono una nuova collezione. Ciò è utile negli algoritmi concorrenti, poiché non richiede alcun blocco per aggiungere qualcosa a una raccolta. Potrebbe comportare costi aggiuntivi, ma questa proprietà può essere molto utile. Le collezioni immutabili di Scala sono fully persistent data structures.

La differenza è molto simile a quella tra var e val, ma si badi bene:

  1. È possibile modificare una raccolta mutabile legato ad un val sul posto, anche se non è possibile riassegnare la val
  2. non è possibile modificare una raccolta immutabile sul posto, ma se è assegnata a un var, è possibile riassegnare quello var a una raccolta creata da esso mediante un'operazione come +.

Non tutte le collezioni necessariamente esistono in varianti mutevoli e immutabili; l'ultima volta che ho controllato, erano supportate solo le code di priorità mutabili.

+0

Grazie, questo ha senso! – astay13

+4

Eccellente sintesi di mutable vs immutable. Bel lavoro. – Clive

+0

In 'var a = 0', se due thread tentano contemporaneamente di fare' a = 1' e 'a = 2' contemporaneamente, come viene gestito? Non richiede il blocco? – Jus12

6

Immutabile significa immutabile. val rende un riferimento non modificabile, il che significa che non è possibile assegnare un valore a val dopo l'inizializzazione. Le collezioni immutabili rendono la collezione stessa immutabile e non il riferimento ad essa. Ogni volta che modifichi una collezione immutabile, viene prodotta un'altra collezione invece di modificare la raccolta originale sul posto. La maggior parte delle collezioni ha versioni immutabili e mutevoli, ma naturalmente ci sono delle eccezioni.