2011-10-13 3 views
2

trimList() 메소드를 통해 ArrayList를 사용할 수 있다는 의미에서 HashMap을 압축하는 방법이 있습니까?Java : HashMap (ArrayList # trimToSize의 아날로그)을 압축하십시오.

내가 생각할 수있는 한 가지 방법은 현재지도의 모든 항목을 반복하고 새지도를 채운 다음 원본을 새지도로 바꾸는 것입니다.

더 좋은 방법이 있나요?

+0

HashMap이 추가 공간을 차지할까봐 걱정된다면, 생성 할 때 더 높은로드 팩터를 전달하십시오. – Jagat

답변

5

그럼 당신은 수동으로을 반복을 통해 갈 필요가 없습니다 - 당신은 그냥 사용할 수 있습니다

map = new HashMap<String, String>(map); // Adjust type arguments as necessary 

나는 그런 당신을 위해 모든 반복을 할 것으로 판단된다. 그것은 가능합니다clone() 같은 일을 할 것이지만, 나는 확실히 모른다.

어느 쪽이든, 나는 당신이 아무것도 놓치고 있다고 생각하지 않는다. 현재 API에서 "trim"연산을 수행 할 방법이 없다고 생각한다. ArrayList과 달리 이러한 작업은 확장성에 따라 다소 복잡 할 수 있습니다. 새 배열을 만들고 단일 배열 복사본을 수행하는 것만이 아닙니다. 항목을 재배포해야합니다. HashMap을 내부적으로 처리하는 이점은 아마도 해시 코드가 다시 계산할 필요가 없다는 것입니다.

+0

수동으로 반복하는 아이디어는 흥미 롭습니다! 해시 맵의 항목을 잡기 위해 특별한 장갑이 필요합니까? :-) –

+0

@JBNizet : 예, 그렇습니다. 마지막 해시 필드가있는'HashMap.Entry'를보십시오. 내가 뭔가 잘못 이해 한거야? –

+0

아니야. 엔트리의 해시 필드를 놓쳤습니다. 내 실수. –

-1

대신 trove library을 사용하면 해시 맵 및 해시 세트 트리밍 (THashMap 객체, 소형 메소드 참조)을 지원하며지도가 너무 희박 해지면 객체 제거시 자동으로 트리밍됩니다. 이것은 표준 java HashMap 구현을 사용해 새로운 맵을 구축하는 것보다 빠르지 않으면 안됩니다 (아마도) 해시 코드에 따라 객체를 재정렬 할 필요는 없지만 이미 알고있는 순서를 사용할 수 있습니다.