저는 스칼라를 처음 접했고 컬렉션 계층 구조를 이해하려고합니다. '변경 가능'컬렉션과 '불변'컬렉션은 구분되어 있지만 구현 수준에서 이것이 실제로 무엇을 의미하는지, 그리고 이것이 val
및 var
과 어떤 관련이 있는지 이해하지 못합니다. 아무도 나에게 이것에 대해 약간의 통찰력을 줄 수 있습니까? 또한 모든 컬렉션 클래스는 '변경 가능'버전과 '변경 불가능한'버전이 있습니까, 아니면 '변경 가능'또는 '변경 불가능'일 수있는 클래스가 있습니까?스칼라 컬렉션에서 변경 가능 vs. 변경 불가능
30
A
답변
50
변경 가능은 컬렉션을 내부에서 변경할 수 있음을 의미합니다. 따라서 컬렉션이 c
이고 +=
인 요소를 추가하는 경우 c
이 변경되어 그 컬렉션에 대한 다른 모든 참조가 변경됩니다.
변경할 수 없음은 컬렉션 개체가 절대로 변경되지 않는다는 것을 의미합니다. 대신 +
또는 ++
과 같은 작업으로 새 컬렉션 개체를 만들면 은 새 컬렉션을 반환합니다. 이는 콜렉션에 무언가를 추가하기 위해 잠금이 필요 없기 때문에 동시 알고리즘에서 유용합니다. 약간의 비용이 들지만,이 속성은 매우 유용 할 수 있습니다. 스칼라의 불변 컬렉션은 fully persistent data structures입니다.
의 차이는 var
와 val
사이의 그것과 매우 유사하지만, 마음은 당신 : 당신이 val
를 재 할당 할 수 있지만
- 당신은에서의 장소
val
에 바인딩 변경 가능한 콜렉션을 수정할 수 있습니다 - 내부에서 변경 불가능한 컬렉션을 수정할 수는 없지만
var
에 할당 된 경우+
과 같은 작업으로 해당 컬렉션에 빌드 된var
을 해당 컬렉션에 다시 할당 할 수 있습니다.
모든 콜렉션이 가변 및 변경 불가능한 변형에 반드시 존재하는 것은 아닙니다. 마지막으로 확인한 후에는 우선 순위가 변경 될 수있는 대기열 만 지원되었습니다.
6
변경할 수 없음을 의미합니다. val
은 참조를 변경하지 못하게합니다. 즉, 초기화 된 후에 val
에 값을 할당 할 수 없습니다. 변경할 수없는 콜렉션은 콜렉션 자체에 대한 참조가 아닌 콜렉션 자체를 변경할 수 있도록합니다. 변경할 수없는 컬렉션을 수정할 때마다 원본 컬렉션을 현재 위치에서 수정하는 대신 다른 컬렉션이 만들어집니다. 대부분의 컬렉션에는 변경 불가능한 버전과 변경 가능한 버전이 있지만 예외는 있습니다.
관련 문제
- 1. 파이썬 범위 변경 가능 vs 변경 불가능
- 2. 변경 가능 vs 병렬 응용 프로그램에 대해 변경 불가능
- 3. 스칼라 : 변경 가능 객체 변경 - OutOfMemoryError
- 4. 비즈니스 로직 오브젝트와 변경 가능하고 변경 불가능
- 5. Java Popsicle 변경 불가능
- 6. 변경 불가능 스택
- 7. 저장소 및 변경 불가능 개체?
- 8. 캡슐화 가능 변경 가능
- 9. 로컬로 변경 가능한 변경 가능 맵에서 변경 가능 맵을 반환하는 기본 방법은 무엇입니까?
- 10. 가변 개체와 변경 불가능 개체의 차이점
- 11. PHP DOMElement는 변경 불가능합니다. = '수정 불가능 오류'
- 12. 변경 가능 위젯
- 13. Meteor.userId가 변경 가능
- 14. ResourceManager 변경 (업데이트 가능)
- 15. VB.net의 형식 변경 VS
- 16. Java Set의 오브젝트에 대한 변경 가능 필드
- 17. Observable 컬렉션에서 컬렉션 변경 이벤트의 예
- 18. 변경 가능 배열 및 스프라이트
- 19. IEquatable 구현 변경 가능 유형
- 20. 변경 가능 : 이메일 헤더의 필드?
- 21. 불변 및 변경 가능 C#
- 22. NSNumber = 0 배열이 변경 가능
- 23. 변경 가능 또는 불변 클로우즈
- 24. 하스켈 변경 가능 맵/트리
- 25. VS 2010에서 글꼴 다듬기 변경
- 26. VS 2010 기본 스킨 변경
- 27. VS 디버깅 및 변경 변수보기
- 28. 여러 VS 프로젝트의 설정 변경
- 29. jQuery 편집 가능/편집 불가능 양식
- 30. 비 병렬 응용 프로그램에서 변경 불가능 성이 유용합니까?
감사합니다. – astay13
변경 가능 vs 불변의 우수 요약. 잘 하셨어요. – Clive
'var a = 0'에서, 두 개의 쓰레드가 동시에'a = 1 '과'a = 2'를 동시에 수행하려고한다면 어떻게 처리할까요? 잠금이 필요하지 않습니까? – Jus12