2009-03-11 20 views
6

내 응용 프로그램에는 한 종류의 모든 객체가 다른 종류의 객체와 정확히 일치하는 두 종류의 객체가 있습니다.Java에서 Map 키로 임의의 객체를 사용하면 어떤 단점이 있습니까?

이 관계를 추적하는 확실한 선택은 HashMap과 같이 Map<type1, type2>입니다. 하지만 어쨌든, 나는 의심 스럽다. 오브젝트를 맵에서 키로 사용하고, 전달하고, 다른 콜렉션에 놓고 언제든지지도에서 파트너를 검색 할 수 있습니까?

개체를 만든 후에는 내가 지나가고있는 것이 바로 식별자입니다. 맞습니까? 그래서 아마 아무런 문제가 없습니다. 키를 직렬화 및 비 직렬화하면 어떻게 될까요?

기타주의 사항? 나 자신을 생성하는 숫자와 같은 객체 쌍을 서로 연관시키기 위해 뭔가 다른 것을 사용해야합니까?

답변

22
  1. 의 핵심 요구 사항 구현하는 .equals() 제대로 .hashCode()
  2. 핵심 그것이 키로서 사용 이상적 키
  3. 어떤 객체로 사용되는 동안은 .hashCode() 값의 변경 어떤 방식으로 변경할 수 없습니다한다 HashMap에 있어야합니다. 그러면 자동으로 2.가 항상 유지됩니다.
  4. GCed 될 수있는 객체는 키 및/또는 값으로 사용될 때 주변에 유지 될 수 있습니다.
0

모든 개체는 맵 키가 될 수 있습니다. 여기서 중요한 점은 map 키로 사용될 모든 객체에 대해 .equals() 및 .hashCode()를 재정의하는지 확인하는 것입니다.

당신이하지 않는 경우 equals는 객체 평등으로 이해 될 것이고, "equal"map 키를 찾을 수있는 유일한 방법은 원래 객체를 다루는 것입니다 그 자체.

hashCode가 equals와 일치해야하므로 해독 코드를 재정의합니다. 이것은 여러분이 정의한 객체가 똑같이 해시가 같아 지도록하기 위해서입니다.

0

오류 지점은 해시 코드 및 같음 함수입니다. 일관되고 적절한 반환 값을 생성하지 않으면 맵이 이상하게 작동합니다. Effective Java에는 전체 섹션이 있으며 매우 강력하게 권장됩니다.

7

나는 하나 종류의 모든 객체가 정확히 하나가 다른 종류의 객체를 해당이 내 응용 프로그램에서 객체의 두 종류가 있습니다.

이것은 실제로 has-a 관계처럼 들리므로 간단한 속성을 사용하여 구현 될 수 있습니다.

+0

동의합니다. 나머지 질문은 여전히 ​​다른 사람들에게 유용 할 수 있습니다. ' (또는 어떤 이유로 든 대안이 아닌 경우 @OP 용) –

+0

@ saau 나는 당신과 동의합니다. 나는이 특정 상황에서 속성의 적용 가능성을 지적 하겠지만. –

1

표준지도를 사용할 수 있지만 그렇게하면지도에서 개체에 대한 강력한 참조가 유지됩니다. 만약 당신의 객체가 다른 구조체에서 참조되고 있고 그것들을 링크하기 위해서 Map이 필요하다면 WeakHashMap을 사용해보십시오.

그리고 같은 객체의 여러 인스턴스를 고려하지 않으면 BTW를 사용하면 equals 및 hashCode를 재정의 할 필요가 없습니다.

1

오브젝트를 맵에서 키로 사용하고, 전달하고, 다른 콜렉션에 놓고 언제든지지도에서 파트너를 검색 할 수 있습니까?

예, 여기에 전혀 문제가 없습니다.

개체를 만든 후에는 내가 지나가고있는 모든 것이 식별자입니다. 맞습니까? 그래서 아마 아무런 문제가 없습니다. 키를 직렬화 및 비 직렬화하면 어떻게 될까요?

맞아요, 당신은 단지 참조를 통과하고 있습니다 - 그들은 모두 같은 실제 객체를 가리킬 것입니다. 개체를 serialize하거나 deserialize하면 새 개체가 만들어집니다. 그러나 객체가 equals 및 hashCode를 올바르게 구현하는 경우 새 비 직렬화 객체를 사용하여지도에서 항목을 검색 할 수 있어야합니다.

기타주의 사항? 나 자신을 생성하는 숫자와 같은 객체 쌍을 서로 연관시키기 위해 뭔가 다른 것을 사용해야합니까?

예를 들어, 개체가지도에있는 동안 개체의 hashCode가 변경되는 원인을 변경할 수는 없습니다.

3

그것은 당신이 선택하는지도의 구현에 따라 다릅니다

  • 의 HashMap등호()해시 코드()을 사용합니다. 기본적으로 (Object에서) 이는 개체 ID를 기반으로하며, serialize/deserialize하지 않는 한 정상적으로 작동합니다. 객체의 내용에 따라 equals() 및 hashCode()를 올바르게 구현하면 해시 맵의 키인 동안 객체를 수정하지 않는 한 아무런 문제가 없습니다.

  • TreeMapcompareTo()을 사용합니다. 기본 구현이 없으므로이를 제공해야합니다. 위의 hashCode() 및 equals()를 구현할 때와 동일한 제한 사항이 적용됩니다.

0

Google 컬렉션의 BiMap을 고려해 볼 수 있습니다.

관련 문제