본문으로 건너뛰기
김신건의 로그

[Java] TreeMap

· 수정 · 📖 약 1분 · 407자/단어 #java #collection #map #tree #red-black-tree #sorted
TreeMap, java.util.TreeMap, Java TreeMap, 트리맵, 정렬 맵

정의

java.util.TreeMap<K,V>Red-Black Tree 기반의 정렬된 Map. NavigableMap (확장 인터페이스) 을 구현해 범위 쿼리, floor/ceiling, sub-map 같은 정렬 기반 연산을 제공한다.

key 는 자연 순서 (Comparable) 또는 생성 시 지정한 Comparator 로 정렬된다.

시각화

핵심 메서드 (NavigableMap)

TreeMap<Integer, String> tm = new TreeMap<>();
tm.put(10, "a"); tm.put(20, "b"); tm.put(30, "c");

tm.firstKey();           // 10
tm.lastKey();            // 30
tm.floorKey(15);         // 10  (≤ 15 중 가장 큰)
tm.ceilingKey(15);       // 20  (≥ 15 중 가장 작은)
tm.higherKey(20);        // 30  (> 20 중 가장 작은)
tm.lowerKey(20);         // 10  (< 20 중 가장 큰)

tm.subMap(10, 30);       // [10, 30) 의 view
tm.headMap(20);          // < 20 의 view
tm.tailMap(20);          // >= 20 의 view

tm.descendingMap();      // 역순 view

이런 정렬 기반 연산이 필요할 때 TreeMap. 그 외에는 HashMap 이 빠르다.

복잡도

Red-Black Tree 의 성질.

작업시간
get, put, removeO(log n)
containsKeyO(log n)
firstKey, lastKeyO(log n)
floorKey, ceilingKeyO(log n)
순회O(n) (정렬 순서)

HashMap 의 평균 O(1) 보다 느리지만 최악도 O(log n) 으로 보장된다는 점이 강점.

Comparator 사용

TreeMap<String, Integer> reverse = new TreeMap<>(Comparator.reverseOrder());
TreeMap<Person, String> byAge = new TreeMap<>(Comparator.comparingInt(Person::age));

Comparator 가 일관되지 않으면 (transitive 위반 등) tree 가 깨진다.

null key 비허용

HashMap 과 달리 key 에 null 을 넣으면 NullPointerException (자연 순서 비교를 할 수 없음). Comparator 가 null 을 처리하도록 만들면 가능하지만 보통 안 한다.

사용 사례

  • 시간순 이벤트 조회: TreeMap<Instant, Event> + subMap(start, end)
  • 범위 빈도수: 가격대별 상품 수, 점수 구간별 통계
  • Floor / Ceiling lookup: 할인율 구간 찾기, IP 범위 매칭
  • 자동완성 prefix: subMap(prefix, prefix + "\uffff")

ConcurrentSkipListMap 과의 비교

항목TreeMapConcurrentSkipListMap
백킹Red-Black TreeSkip List
Thread-safe
단일 스레드 성능빠름약간 느림
동시성외부 동기화 필요lock-free 읽기

함정

1. Comparator 와 equals 의 불일치

TreeMap 은 equals 가 아니라 compareTo/Comparator.compare 로 동등성 을 판단한다. 두 key 가 equals 는 false 인데 compare 가 0 을 반환하면 같은 key 로 취급.

TreeMap<BigDecimal, String> tm = new TreeMap<>();
tm.put(new BigDecimal("1.0"), "a");
tm.put(new BigDecimal("1.00"), "b");
// tm.size() == 1, "b" 가 "a" 를 덮어씀
// BigDecimal.compareTo 는 scale 을 무시

참고

이 글의 용어 (8개)
[Java] Collectionjava
정의 는 그룹으로 묶인 객체들을 표현하는 최상위 인터페이스. JCF (Java Collections Framework) 의 입구이자, / / / 모두 이를 확장한다. 자체는 직접…
[Java] ConcurrentHashMapjava
정의 는 고동시성 환경에서 사용 가능한 구현. JSR-166 (Java 5) 도입, Java 8 에서 내부 구조가 크게 재작성됐다. 과 같은 인터페이스를 제공하면서 thread-…
[Java] ConcurrentSkipListMapjava
정의 는 Skip List 기반의 thread-safe 정렬 . 의 동시성 버전. 과의 결정적 차이: 정렬 순서를 유지 + 인터페이스 구현 ( , , 등). Skip List 는…
[Java] HashMapjava
정의 는 해시 테이블 로 구현된 . 평균 O(1) 의 put/get/remove 를 보장하고 단일 스레드 환경의 사실상 표준. JDK 1.2 도입, Java 8 에서 충돌 시 l…
[Java] Iterablejava
정의 는 루프로 순회 가능한 모든 타입의 최상위 인터페이스. 단 하나의 추상 메서드, 를 정의한다. 인터페이스가 을 extends 하므로 , , , 등 모든 컬렉션이 자동으로 대…
[Java] LinkedHashMapjava
정의 는 을 상속해 삽입 순서 (또는 접근 순서) 를 유지 하는 Map. 모든 의 평균 O(1) 성능을 유지하면서 추가로 순회 순서가 일관된다. 핵심: 이중 연결 리스트 (dou…
[Java] Objectjava
정의 는 Java 의 모든 클래스의 최상위 부모 (root) 클래스. 가 명시되지 않은 클래스는 컴파일러가 자동으로 를 붙인다. 인터페이스는 클래스가 아니라 를 직접 상속하지는 …
집합과 맵 (Set and Map)algorithm
정의 집합 (Set) 은 고유한 원소들의 모임을 나타내는 추상 자료구조로, 멤버십 검사, 삽입, 삭제를 지원한다. 맵 (Map, Dictionary) 은 키-값 쌍을 저장하며, …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기