La ventaja de las estructuras de datos inmutables, en este caso Conjunto, es que son persistentes. Por ejemplo:
var jetSet1 = Set("Boeing", "Airbus")
val jetSet2 = jetSet1 // ... imagine jetSet2 is somewhere else in the program
jetSet1 += "Lear"
assert(!jetSet2.contains("Lear"))
inmutabilidad de este conjunto de objetos hace que sea más fácil de razonar sobre el programa debido a cambios a la variable jetSet1
no tienen efectos secundarios en otras partes del código (en este caso, donde se utiliza jetSet2
) Aunque no está claro en este ejemplo, hay ocasiones en las que es conveniente almacenar valores inmutables en referencias var
mutables; la mayoría de las veces, el var
tendrá un alcance limitado (por ejemplo, local para una función).
Las estructuras de datos inmutables a menudo tienen implementaciones inteligentes que son bastante eficientes. Desafortunadamente, la API de la colección Scala no está bien documentada con respecto al rendimiento, pero esperaría que la mayoría de las operaciones tengan aproximadamente O (log N). Por ejemplo, dado un gran conjunto inmutable s
, uno debería ser capaz de construir eficientemente s + x
, un nuevo conjunto con un elemento adicional. Por supuesto, la inmutabilidad garantiza que también se conserva s
. Debajo del capó, s
y s+x
se almacenarán utilizando algún tipo de árbol de estructuras de datos con componentes compartidos.
El título de tu pregunta sugerimos que también está buscando consejo sobre el uso val
o var
. La regla de oro es usar val
siempre que pueda convenientemente. Si es necesario var
, intente limitar el alcance de la variable tanto como sea posible.
No directamente en la API pero el rendimiento * se * [documentado] (http://www.scala-lang.org/docu/files/collections-api/collections.html). – Debilski
Gracias por el enlace –
Muchas operaciones son, como es de esperar, O (log n), pero debe señalarse que la base del logaritmo es tan alta como para que sean efectivas operaciones O (1). En términos prácticos, las operaciones en las estructuras de datos inmutables de Scala están dentro de un factor constante de las operaciones correspondientes en sus primos mutables. –