Я новичок в Scala и пытаюсь понять иерархию коллекций. Я вижу различие между «изменяемыми» и «неизменяемыми» коллекциями, но я не понимаю, что это на самом деле означает на уровне реализации и как это относится к val
и var
. Может ли кто-нибудь дать мне некоторое представление об этом? Кроме того, есть ли у каждого класса коллекции «изменяемая» версия и «неизменяемая» версия, или есть классы, которые могут быть только «изменяемыми» или «неизменяемыми»?
изменяемые и неизменяемые в коллекциях Scala
Ответы (2)
Изменяемый означает, что вы можете изменять коллекцию на месте. Итак, если у вас есть коллекция c
и вы добавляете элемент с помощью +=
, тогда c
изменился, как и все остальные ссылки на эту коллекцию.
Неизменяемость означает, что объект коллекции никогда не изменяется; вместо этого вы создаете новые объекты коллекции с помощью таких операций, как +
или ++
, которые возвращают новую коллекцию. Это полезно в параллельных алгоритмах, поскольку не требует блокировки для добавления чего-либо в коллекцию. Это может быть связано с некоторыми накладными расходами, но это свойство может быть очень полезным. Неизменяемые коллекции Scala - это полностью постоянные структуры данных.
Разница очень похожа на разницу между var
и val
, но учтите:
- Вы можете изменить изменяемую коллекцию, привязанную к
val
на месте, но не можете переназначитьval
- вы не можете изменить неизменяемую коллекцию на месте, но если она назначена
var
, вы можете переназначить ееvar
коллекции, созданной из нее, с помощью такой операции, как+
.
Не все коллекции обязательно существуют в изменяемых и неизменяемых вариантах; в последний раз, когда я проверял, поддерживались только очереди с изменяемым приоритетом.
var a = 0
, если два потока одновременно пытаются выполнять a = 1
и a = 2
одновременно, как это обрабатывается? Не требует блокировки?
- person Jus12; 11.01.2018
Неизменяемый означает неизменный. val
делает ссылку неизменной, что означает, что вы не можете присвоить значение val
после ее инициализации. Неизменяемые коллекции делают неизменной саму коллекцию, а не ссылку на нее. Каждый раз, когда вы изменяете неизменяемую коллекцию, вместо изменения исходной коллекции на месте создается другая коллекция. У большинства коллекций есть как неизменяемые, так и изменяемые версии, но, конечно, есть исключения.