단독 연결 목록을 작성하기로 결정하고 내부 연결 노드 구조를 변경할 수 없도록 계획했습니다.
나는 걸림돌에 부딪쳤다. 이전 add
작업 에서 다음과 같은 연결된 노드가 있다고 가정 해보십시오 .
1 -> 2 -> 3 -> 4
을 추가하고 싶다고 말하십시오 5
.
이렇게하려면 노드 4
가 변경 불가능하므로 새 복사본을 만들어야 4
하지만 해당 next
필드를를 포함하는 새 노드로 바꿔야 합니다 5
. 문제는 지금, 3
이전을 참조하는 것입니다 4
. 추가되지 않은 것 5
. 이제 copy를 복사 하고 사본 을 참조 3
하기 위해 next
필드를 교체 해야 4
하지만 이제는 2
이전을 참조합니다 3
...
즉, 추가를 수행하려면 전체 목록을 복사해야합니다.
내 질문 :
내 생각이 맞습니까? 전체 구조를 복사하지 않고 추가 할 수있는 방법이 있습니까?
분명히 "유효한 Java"는 다음과 같은 권장 사항을 포함합니다.
클래스를 변경 가능한 이유가없는 한 클래스는 변경할 수 없습니다 ...
이것은 가변성에 대한 좋은 사례입니까?
나는 이것이 목록 자체에 대해 이야기하지 않기 때문에 이것이 제안 된 답변의 사본이라고 생각하지 않습니다. 인터페이스를 준수하기 위해 분명히 변경 가능해야합니다 (새로운 목록을 내부적으로 유지하고 게터를 통해 검색하지 않는 것). 두 번째 생각에도 약간의 돌연변이가 필요합니다. 최소한으로 유지됩니다. 목록의 내부를 변경할 수 없는지 여부에 대해 이야기하고 있습니다.
CopyOnWritexxx
멀티 스레딩에 사용되는 엄청나게 비싼 클래스입니다. 컬렉션이 실제로 불변이 될 것으로 기대하는 사람은 아무도 없습니다 (