изменяемые и неизменяемые в коллекциях Scala

Я новичок в Scala и пытаюсь понять иерархию коллекций. Я вижу различие между «изменяемыми» и «неизменяемыми» коллекциями, но я не понимаю, что это на самом деле означает на уровне реализации и как это относится к val и var. Может ли кто-нибудь дать мне некоторое представление об этом? Кроме того, есть ли у каждого класса коллекции «изменяемая» версия и «неизменяемая» версия, или есть классы, которые могут быть только «изменяемыми» или «неизменяемыми»?


person astay13    schedule 27.11.2011    source источник


Ответы (2)


Изменяемый означает, что вы можете изменять коллекцию на месте. Итак, если у вас есть коллекция c и вы добавляете элемент с помощью +=, тогда c изменился, как и все остальные ссылки на эту коллекцию.

Неизменяемость означает, что объект коллекции никогда не изменяется; вместо этого вы создаете новые объекты коллекции с помощью таких операций, как + или ++, которые возвращают новую коллекцию. Это полезно в параллельных алгоритмах, поскольку не требует блокировки для добавления чего-либо в коллекцию. Это может быть связано с некоторыми накладными расходами, но это свойство может быть очень полезным. Неизменяемые коллекции Scala - это полностью постоянные структуры данных.

Разница очень похожа на разницу между var и val, но учтите:

  1. Вы можете изменить изменяемую коллекцию, привязанную к val на месте, но не можете переназначить val
  2. вы не можете изменить неизменяемую коллекцию на месте, но если она назначена var, вы можете переназначить ее var коллекции, созданной из нее, с помощью такой операции, как +.

Не все коллекции обязательно существуют в изменяемых и неизменяемых вариантах; в последний раз, когда я проверял, поддерживались только очереди с изменяемым приоритетом.

person Fred Foo    schedule 27.11.2011
comment
В var a = 0, если два потока одновременно пытаются выполнять a = 1 и a = 2 одновременно, как это обрабатывается? Не требует блокировки? - person Jus12; 11.01.2018

Неизменяемый означает неизменный. val делает ссылку неизменной, что означает, что вы не можете присвоить значение val после ее инициализации. Неизменяемые коллекции делают неизменной саму коллекцию, а не ссылку на нее. Каждый раз, когда вы изменяете неизменяемую коллекцию, вместо изменения исходной коллекции на месте создается другая коллекция. У большинства коллекций есть как неизменяемые, так и изменяемые версии, но, конечно, есть исключения.

person agilesteel    schedule 27.11.2011