Подтвердить что ты не робот

Mutable vs. immutable в коллекциях Scala

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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