











想了解的 TreeMap 应该是编程领域(尤其是 Java)中的 TreeMap 集合类,本文从核心概念、特性、使用方法到底层原理,做一个通俗易懂的详细介绍,彻底理解它的用法和适用场景。
TreeMap 是 Java 集合框架中 Map 接口的一个实现类,属于 java.util 包,它的核心特点是:基于红黑树(一种自平衡的二叉查找树)实现,能够对键(Key)进行自动排序。
简单来说,你可以把它理解成一个 “有序的字典”—— 普通的 HashMap 是无序的,而 TreeMap 会按照键的规则自动把键值对排好序,不用你手动处理排序逻辑。
Comparator 自定义排序规则(比如按字符串长度、按数字倒序)。O(log n)(比 HashMap 的 O(1) 慢,但胜在有序)。NullPointerException;值可以为 null。Collections.synchronizedSortedMap() 包装),或使用 ConcurrentSkipListMap(并发版的有序 Map)。equals() 和 compareTo()/Comparator 共同保证(红黑树通过比较判断键是否重复)。下面通过完整代码示例,展示 TreeMap 的核心用法:
import java.util.TreeMap;
public class TreeMapBasic {
public static void main(String[] args) {
// 1. 创建 TreeMap,默认按键的自然顺序排序(Integer 升序)
TreeMap<Integer, String> treeMap = new TreeMap<>();
// 2. 添加键值对
treeMap.put(3, "张三");
treeMap.put(1, "李四");
treeMap.put(2, "王五");
treeMap.put(4, "赵六");
// 3. 遍历(输出会按键升序排列:1->2->3->4)
System.out.println("默认自然排序结果:");
for (Integer key : treeMap.keySet()) {
System.out.println(key + " : " + treeMap.get(key));
}
// 4. 常用方法
System.out.println("\n键的最小值:" + treeMap.firstKey()); // 输出 1
System.out.println("键的最大值:" + treeMap.lastKey()); // 输出 4
System.out.println("小于等于 3 的最大键:" + treeMap.floorKey(3)); // 输出 3
System.out.println("大于 2 的最小键:" + treeMap.ceilingKey(2)); // 输出 2
System.out.println("移除并返回最小键的键值对:" + treeMap.pollFirstEntry()); // 输出 1=李四
}
}
输出结果:
默认自然排序结果:
1 : 李四
2 : 王五
3 : 张三
4 : 赵六
键的最小值:1
键的最大值:4
小于等于 3 的最大键:3
大于 2 的最小键:2
移除并返回最小键的键值对:1=李四
如果想按键的倒序排列,或按自定义规则排序,可传入 Comparator:
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMapCustomSort {
public static void main(String[] args) {
// 1. 传入 Comparator,按 Integer 键倒序排序
TreeMap<Integer, String> treeMap = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 倒序:o2 - o1(升序是 o1 - o2)
return o2 - o1;
}
});
treeMap.put(3, "张三");
treeMap.put(1, "李四");
treeMap.put(2, "王五");
// 遍历(输出按键倒序:3->2->1)
System.out.println("自定义倒序排序结果:");
treeMap.forEach((key, value) -> System.out.println(key + " : " + value));
}
}
输出结果:
自定义倒序排序结果:
3 : 张三
2 : 王五
1 : 李四
如果用自定义对象(比如 User)作为键,必须让对象实现 Comparable 接口(或传入 Comparator),否则会抛出 ClassCastException:
import java.util.TreeMap;
// 自定义 User 类,实现 Comparable 接口(按 age 升序)
class User implements Comparable<User> {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 实现 compareTo 方法,定义排序规则
@Override
public int compareTo(User o) {
// 按年龄升序,若年龄相同按姓名字典序
if (this.age != o.age) {
return this.age - o.age;
}
return this.name.compareTo(o.name);
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
public class TreeMapCustomKey {
public static void main(String[] args) {
TreeMap<User, String> treeMap = new TreeMap<>();
treeMap.put(new User("张三", 25), "北京");
treeMap.put(new User("李四", 22), "上海");
treeMap.put(new User("王五", 25), "广州");
// 遍历(按 age 升序,age 相同按 name 排序)
System.out.println("自定义对象键的排序结果:");
treeMap.forEach((key, value) -> System.out.println(key + " : " + value));
}
}
输出结果:
自定义对象键的排序结果:
User{name='李四', age=22} : 上海
User{name='张三', age=25} : 北京
User{name='王五', age=25} : 广州
| 特性 | TreeMap | HashMap |
|---|---|---|
| 底层结构 | 红黑树 | 数组 + 链表 / 红黑树 |
| 有序性 | 按键有序(自然 / 自定义) | 无序(JDK8 后按插入顺序) |
| 时间复杂度 | 增删改查 O (log n) | 增删改查 O (1)(平均) |
| 键是否可为 null | 不可 | 可以(仅一个) |
| 排序支持 | 天然支持 | 需手动排序(如 Collections.sort) |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。