2012-06-16 3 views
0

시간이 지남에 따라 키가 변화하는 객체를 저장하기 위해 해시 맵을 사용하고 있습니다.
HashMap 키 udpate와 더블 엔트리

HashMap<String,Stuff> hm = new HashMap<String,Stuff>() 
Stuff stuff = new Stuff(); 
hm.put("OrignalKey", stuff); 

나는 "OrignalKey"을 제거보다 더 나은 아무것도 넣어() 동일한 개체에 새 항목을 찾을 수 없습니다.

  1. 중복 항목을 떠나 ​​실제 메모리 비용은 무엇입니까 (겹치는 위험이 없음) :

     
    hm.remove("OriginalKey"); 
    hm.put("NewKey", stuff); 
    

    제거는() 따라서 내 질문에 상당한 CPU에 부담을주고있는 것 같다?

  2. 방금 ​​깔끔한 swapKey() 메소드가 누락 되었습니까?
+2

아마도 너무 명백한 해결책입니다. 시간이 지남에 따라 "진화 할"키를 사용하지 마십시오. –

+0

? 아마도 StringBuilder를 사용 하시겠습니까? –

+0

나는 그것에게 탄, 감사를 줄 것이다 – MonoThreaded

답변

5

중복 항목을 떠나 ​​실제 메모리 비용 (겹치는 위험이 없다)이란 무엇입니까?

음, 여분의 항목이 있으며 키 자체를 가비지 수집 할 수 없습니다. 키가 "커다란"경우 문제가 될 수 있습니다. 또한 정확한 카운트를 얻을 수 없다는 것을 의미하며, 모든 값에 대해 현명하게 반복 할 수는 없습니다. 나에게 나쁜 생각처럼 보입니다.

방금 ​​깔끔한 swapKey() 메소드가 누락 되었습니까?

내게는 매우 드문 요구 사항입니다. 그런 방법은 당신이하는 일을 거의해야 할 것입니다. 예전의 키를 찾아 데이터 구조에서 제거하고 새로운 키에 대한 엔트리를 삽입해야합니다. 한 번에 두 작업에 대해 알면 어떤 최적화도 가능할 것이라고 쉽게 상상할 수 없습니다.

+0

신속한 답장을 보내 주셔서 감사합니다. 네가 모든 메달에 수레가 필요하다면 알려줘. o) – MonoThreaded

1

키가 해싱에 사용되므로 키 교환이 쉽지 않습니다. 키를 변경하면 해시 값이 가장 다를 수 있습니다. 이 경우 키를 변경하면 삭제 및 다시 삽입을 따릅니다.