1

나는 ConcurrentSkipListMap입니다. 나는 key보다 낮은 요소를 제거해야합니다. 여기ConcurrentSkipListMap에서 키를 지정할 요소를 제거하는 방법?

내가 그것을 수행 할 수있는 방법입니다

private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>(); 

//... 

myObjectsMap = myObjectsMap.tailMap(10.25, false); 

확인을 보이는

, 그러나 나는 이러한 사실에 대해 혼란 스러워요 :

1.

반환되는 맵은이 맵에 연동 따라서 반환 된지도 의 변경 사항이이지도에 반영되며 그 반대의 경우도 마찬가지입니다.

이전 값이 가비지 수집기에서 제거되지 않는다는 의미입니까?
즉, 우리는 이전지도를 제거하고 이제는 새로운지도를 얻습니다. 그러나이 새지도는 이전지도에 의해 뒷받침됩니다. 그러면 오래된지도는 어떻게됩니까? 그것이 제거되거나 영원히 기억에 남을 것인가?

2.

반환지도

은, 그 범위 외의 키가 삽입하려는 시도 에 IllegalArgumentException를 throw합니다.

이제 10.25보다 작고 마지막 최대 값보다 큰 새 키를 넣을 수 없습니까?

혼란스러워. 그렇다면 정확히 어떻게 ConcurrentSkipListMap에서 요소를 제거해야합니까?

+0

헤드 내용을 새로운 맵으로 복사하는 것이 가장 안전하지 않을까요?'myObjectsMap = new ConcurrentNavigableMap <> (myObjectsMap.headMap (10.25, false)); ' –

답변

2

이전 값이 가비지 수집기에서 제거되지 않는다는 의미입니까? 즉, 우리는 이전지도를 제거하고 이제는 새로운지도를 얻습니다. 그러나이 새지도는 이전지도에 의해 뒷받침됩니다. 그러면 오래된지도는 어떻게됩니까? 그것이 제거되거나 영원히 기억에 남을 것인가?

예, 사실입니다. 오래된지도는 여전히 주변에 있으며 주변에 머무를 것입니다. 도 원래지도에서 제거 - 당신이 키 < 10.25를 제거 하려면

는, 모든 요소를 ​​제거, 그 하위 맵을 생성합니다

map.headMap(10.25, false).clear(); 
을 ... 금지 - - 그런 다음 서브맵보기를 무시하고 가비지 수집을 허용하고> 10.25 이상의 키만 포함하는 원래 맵 객체를 남겨 둡니다.

작업이 시작될 때 < 10.25 인 키를 제거 할 수 있지만 새 키가 동시에 삽입되지 않았거나 나중에 새 키가 삽입 될 수 있다는 보장이 없습니다. 그것에 대해 할 수있는 일은 없습니다. 값> = 10.25 이상에서만 작동한다고 확신하려면 map.tailMap(10.25, true)을 사용하고 다른 값인 10.25 미만은 계속 삽입 될 수 있으며 여전히 메모리에 남아있을 수 있습니다.

+0

그것은 완벽한 해답 일뿐입니다. 명확히 해 주셔서 대단히 감사합니다! – Alexandr