TreeMap默认按key自然顺序升序排序,底层基于红黑树实现;key需实现Comparable接口,否则需显式传入Comparator;不允null key(除非Comparator支持);时间复杂度O(log n),适用于范围查询。

TreeMap 默认按 key 的自然顺序排序
TreeMap 底层是红黑树,它不依赖插入顺序,而是始终根据 key 的大小关系维护有序结构。只要 key 实现了 Comparable 接口(比如 Integer、String),就能自动升序排列:
TreeMapmap = new TreeMap<>(); map.put(3, "c"); map.put(1, "a"); map.put(2, "b"); // 遍历时 key 顺序为 1 → 2 → 3
注意:如果 key 是自定义类且没实现 Comparable,运行时会抛出 ClassCastException,不是编译报错。
用 Comparator 自定义排序逻辑
当需要降序、忽略大小写、或按对象字段排序时,必须传入 Comparator。构造时指定,后续所有操作都遵循该规则:
- 降序整数:
new TreeMap(Collections.reverseOrder()) - 忽略大小写字符串:
new TreeMap(String.CASE_INSENSITIVE_ORDER) - 按 Person.age 排序:
new TreeMap((a, b) -> Integer.compare(a.getAge(), b.getAge()))
别在插入后临时改 Comparator —— TreeMap 构造后无法更换比较器,强行替换会导致结构损坏或 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
TreeMap 的 key 不能为 null(除非显式传入 Comparator)
默认构造的 TreeMap 不允许 null key,因为内部调用 key.compareTo() 会触发 NullPointerException。但如果你传了能处理 null 的 Comparator,就可以存:
TreeMapmap = new TreeMap<>((a, b) -> { if (a == null && b == null) return 0; if (a == null) return -1; if (b == null) return 1; return a.compareTo(b); }); map.put(null, 99); // 合法
不过这种写法容易引发歧义,生产环境建议避免 null key。
和 HashMap、LinkedHashMap 的关键区别在哪
排序代价是核心差异点:
-
TreeMap:put/get/remove时间复杂度都是O(log n);天然有序;不保证线程安全 -
HashMap:平均O(1),无序;允许nullkey/value -
LinkedHashMap:平均O(1),按插入/访问顺序迭代,但不是“值有序”
别为了“看起来有序”而误用 TreeMap —— 如果只是想遍历时保持插入顺序,LinkedHashMap 更快;如果真要范围查询(比如 subMap、headMap),才值得用 TreeMap。










