изменяемый и неизменный в коллекциях Scala - PullRequest
39 голосов
/ 27 ноября 2011

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

Ответы [ 2 ]

60 голосов
/ 27 ноября 2011

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

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

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

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

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

7 голосов
/ 27 ноября 2011

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

...