IdentityHashMap — 참조 동등성 기반 해시 맵

IdentityHashMap — 참조 동등성 기반 해시 맵

IdentityHashMap<K, V>키(와 값) 비교 시 객체 동등성(object-equality) 대신 참조 동등성(reference-equality)을 사용하는 Map 구현이에요. 즉 두 키 k1, k2k1 == k2일 때만 같다고 간주해요. (일반 HashMapk1.equals(k2)로 비교해요.)

출처: Java API Reference

본문

public class IdentityHashMap<K, V> extends AbstractMap<K, V>
    implements Map<K, V>, Serializable, Cloneable

이 클래스는 범용 Map 구현이 아니에요! Map 인터페이스를 구현하지만, 객체 비교 시 equals를 쓰도록 요구하는 Map의 일반 계약을 의도적으로 위반해요. 참조 동등성 의미론이 필요한 드문 경우에만 사용하도록 설계됐어요. 이 맵의 뷰 컬렉션도 요소에 대해 참조 동등성 의미론을 가져요.

전형적인 용도는 위상 보존 객체 그래프 변환(직렬화, 깊은 복사)이에요. 처리된 객체 참조를 추적하는 "노드 테이블"을 유지할 때, 설령 같은 값이어도 다른 객체를 동일시하면 안 되므로 참조 동등성이 필요해요. 또 디버깅용 프록시 객체를 유지할 때도 쓰여요.

이 클래스는 모든 선택적 맵 연산을 제공하고 null 값과 null 키를 허용해요. 순서를 보장하지 않아요. System.identityHashCode(Object)가 요소를 잘 분산한다고 가정하면 기본 연산(get, put)은 상수 시간에 동작해요.

생성자

  • IdentityHashMap() — 기본 예상 최대 크기(21)로 빈 맵을 만들어요.
  • IdentityHashMap(int expectedMaxSize) — 지정된 예상 최대 크기로 만들어요. 예상보다 많은 매핑을 넣으면 내부 구조가 커져 다소 시간이 걸릴 수 있어요.
  • IdentityHashMap(Map m) — 지정된 맵의 매핑을 담아 만들어요.

주요 메서드

  • get(Object key) / containsKey(Object key) / containsValue(Object value) — 참조 동등성(==)으로 검색해요.
  • put(K key, V value) / putAll(Map m) / remove(Object key) / clear() — 참조 동등성 기반으로 동작해요.
  • remove(Object key, Object value) — 키가 ==로 지정된 값에 매핑될 때만 제거하고 true를 반환해요.
  • replace(K key, V oldValue, V newValue)oldValue == v일 때만 교체해요.

뷰와 기타

keySet() / values() / entrySet()은 요소 동등성을 참조 동등성으로 정의하는 뷰를 반환해요. equalshashCode의 대칭성·전이성 계약이 일반 맵과 비교될 때 위반될 수 있지만, IdentityHashMap 인스턴스끼리는 계약이 보장돼요. clone()은 얕은 복사본을 반환해요.

더 알아보기 (Learn more)