TreeMap是基于红黑树实现的有序Map,按键升序排列(可自定义Comparator),所有操作时间复杂度为O(log n),键不可为null,支持范围查询如floorKey、ceilingKey和subMap等。

TreeMap 是 Java 中基于红黑树实现的有序 Map,天然支持按键升序排列(也可自定义比较器),所有操作如 put、get、remove、ceilingKey 等时间复杂度均为 O(log n)。
默认按自然顺序排序(要求键实现 Comparable)
若键类型(如 String、Integer、LocalDate)已实现 Comparable 接口,TreeMap 会自动按其 compareTo() 方法排序:
- 创建方式:
TreeMap<String, Integer> map = new TreeMap<>(); - 插入后遍历结果按字典序输出:
map.put("banana", 2); map.put("apple", 1); map.put("cherry", 3);→ 迭代顺序为 apple → banana → cherry - 注意:键不能为 null(否则抛 NullPointerException)
使用自定义 Comparator 实现灵活排序
当键类型不支持自然序,或需逆序、多字段、忽略大小写等逻辑时,传入 Comparator 构造器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 降序示例:
new TreeMap<>(Collections.reverseOrder()) - 忽略大小写字符串排序:
new TreeMap<>(String.CASE_INSENSITIVE_ORDER) - 自定义类排序(如 Person 按年龄升序):
new TreeMap<>((p1, p2) -> Integer.compare(p1.age, p2.age))
利用有序特性做范围查询和邻近检索
TreeMap 提供多个高效方法,无需遍历全量数据:
立即学习“Java免费学习笔记(深入)”;
-
floorKey(k):返回 ≤ k 的最大键;ceilingKey(k):返回 ≥ k 的最小键 -
headMap(k, inclusive)/tailMap(k, inclusive):获取子映射视图(非拷贝,修改影响原 map) -
subMap(from, fromInclusive, to, toInclusive):获取指定范围的键值对视图 - 示例:查“2023-01-01”到“2023-12-31”之间的订单:
map.subMap(LocalDate.of(2023,1,1), true, LocalDate.of(2023,12,31), true)
与 HashMap、LinkedHashMap 的关键区别
选择 TreeMap 前需明确是否真需要“有序”和“范围操作”:
- HashMap:无序、O(1) 平均查找,适合纯增删查场景
- LinkedHashMap:按插入/访问顺序迭代,不支持范围查询
- TreeMap:有序、O(log n) 查找、支持 floor/ceiling/subMap,但内存开销略大、插入稍慢
- 若仅需排序后遍历一次,用
new TreeMap(map)包装已有 HashMap 更轻量

















