Я новичок в Scala и пытаюсь понять иерархию коллекций. Я вижу, что существует различие между "изменчивыми" и "неизменными" коллекциями, но я не понимаю, что это на самом деле означает на уровне реализации и как это относится к val
и var
. Может ли кто-нибудь дать мне некоторое представление об этом? Кроме того, имеет ли каждый класс коллекции "изменчивую" версию и "неизменяемую" версию, или существуют некоторые классы, которые могут быть только "изменчивыми" или "неизменяемыми"?
Mutable vs. immutable в коллекциях Scala
Ответ 1
Mutable означает, что вы можете изменить коллекцию на месте. Итак, если у вас есть коллекция c
и вы добавляете элемент с +=
, тогда c
изменился, и поэтому имеет все другие ссылки на эту коллекцию.
Неизменяемость означает, что объект коллекции никогда не изменяется; вместо этого вы создаете новые объекты коллекции с такими операциями, как +
или ++
, которые возвращают новую коллекцию. Это полезно в параллельных алгоритмах, поскольку для блокировки не требуется блокировки, чтобы добавить что-то в коллекцию. Это может быть связано с некоторыми издержками, но это свойство может быть очень полезным. Scala неизменяемые коллекции полностью устойчивые структуры данных.
Разница очень похожа на разницу между var
и val
, но заметьте:
- Вы можете изменить измененную коллекцию, привязанную к
val
на месте, хотя вы не можете переназначитьval
- вы не можете изменять неизменяемую коллекцию на месте, но если она назначена на
var
, вы можете переназначить этоvar
в коллекцию, созданную из нее с помощью операции, такой как+
.
Не все коллекции обязательно существуют в изменяемых и неизменяемых вариантах; в последний раз, когда я проверял, поддерживались только измененные очереди приоритетов.
Ответ 2
Неизменяемые средства неизменяемы. val
делает ссылку неизменной, что означает, что вы не можете назначить значение val
после его инициализации. Неизменяемые коллекции делают коллекцию неизменной, а не ссылкой на нее. Каждый раз, когда вы изменяете неизменяемую коллекцию, создается другая коллекция вместо того, чтобы изменять исходную коллекцию на месте. Большинство коллекций имеют неизменяемые и изменяемые версии, но, конечно, есть исключения.