IdentityHashMap — 참조 동등성 기반 해시 맵
IdentityHashMap — 참조 동등성 기반 해시 맵
IdentityHashMap<K, V>는 키(와 값) 비교 시 객체 동등성(object-equality) 대신 참조 동등성(reference-equality)을 사용하는 Map 구현이에요. 즉 두 키 k1, k2가 k1 == k2일 때만 같다고 간주해요. (일반 HashMap은 k1.equals(k2)로 비교해요.)
본문
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()은 요소 동등성을 참조 동등성으로 정의하는 뷰를 반환해요. equals와 hashCode의 대칭성·전이성 계약이 일반 맵과 비교될 때 위반될 수 있지만, IdentityHashMap 인스턴스끼리는 계약이 보장돼요. clone()은 얕은 복사본을 반환해요.