2011-11-27 5 views
30

저는 스칼라를 처음 접했고 컬렉션 계층 구조를 이해하려고합니다. '변경 가능'컬렉션과 '불변'컬렉션은 구분되어 있지만 구현 수준에서 이것이 실제로 무엇을 의미하는지, 그리고 이것이 valvar과 어떤 관련이 있는지 이해하지 못합니다. 아무도 나에게 이것에 대해 약간의 통찰력을 줄 수 있습니까? 또한 모든 컬렉션 클래스는 '변경 가능'버전과 '변경 불가능한'버전이 있습니까, 아니면 '변경 가능'또는 '변경 불가능'일 수있는 클래스가 있습니까?스칼라 컬렉션에서 변경 가능 vs. 변경 불가능

답변

50

변경 가능은 컬렉션을 내부에서 변경할 수 있음을 의미합니다. 따라서 컬렉션이 c이고 += 인 요소를 추가하는 경우 c이 변경되어 그 컬렉션에 대한 다른 모든 참조가 변경됩니다.

변경할 수 없음은 컬렉션 개체가 절대로 변경되지 않는다는 것을 의미합니다. 대신 + 또는 ++과 같은 작업으로 새 컬렉션 개체를 만들면 은 새 컬렉션을 반환합니다. 이는 콜렉션에 무언가를 추가하기 위해 잠금이 필요 없기 때문에 동시 알고리즘에서 유용합니다. 약간의 비용이 들지만,이 속성은 매우 유용 할 수 있습니다. 스칼라의 불변 컬렉션은 fully persistent data structures입니다.

의 차이는 varval 사이의 그것과 매우 유사하지만, 마음은 당신 : 당신이 val 를 재 할당 할 수 있지만

  1. 당신은에서의 장소 val에 바인딩 변경 가능한 콜렉션을 수정할 수 있습니다
  2. 내부에서 변경 불가능한 컬렉션을 수정할 수는 없지만 var에 할당 된 경우 +과 같은 작업으로 해당 컬렉션에 빌드 된 var을 해당 컬렉션에 다시 할당 할 수 있습니다.

모든 콜렉션이 가변 및 변경 불가능한 변형에 반드시 존재하는 것은 아닙니다. 마지막으로 확인한 후에는 우선 순위가 변경 될 수있는 대기열 만 지원되었습니다.

+0

감사합니다. – astay13

+4

변경 가능 vs 불변의 우수 요약. 잘 하셨어요. – Clive

+0

'var a = 0'에서, 두 개의 쓰레드가 동시에'a = 1 '과'a = 2'를 동시에 수행하려고한다면 어떻게 처리할까요? 잠금이 필요하지 않습니까? – Jus12

6

변경할 수 없음을 의미합니다. val은 참조를 변경하지 못하게합니다. 즉, 초기화 된 후에 val에 값을 할당 할 수 없습니다. 변경할 수없는 콜렉션은 콜렉션 자체에 대한 참조가 아닌 콜렉션 자체를 변경할 수 있도록합니다. 변경할 수없는 컬렉션을 수정할 때마다 원본 컬렉션을 현재 위치에서 수정하는 대신 다른 컬렉션이 만들어집니다. 대부분의 컬렉션에는 변경 불가능한 버전과 변경 가능한 버전이 있지만 예외는 있습니다.

관련 문제