一、TreeMap核心机制:红黑树的有序力量
TreeMap 是 SortedMap
接口的核心实现,底层采用红黑树(自平衡二叉查找树)结构存储键值对。红黑树通过约束(节点颜色、黑高度平衡)确保最坏情况下基本操作(插入、删除、查找)的时间复杂度为 O(log n),远优于线性结构。
核心特性:
- 自动排序:键(Key)默认按自然顺序(如数字升序、字符串字典序)或构造时指定的
Comparator
排序。 - 高效范围查询:提供
subMap(K from, K to)
,headMap(K to)
,tailMap(K from)
方法快速获取子视图。 - 有序迭代:
keySet()
,entrySet()
,values()
返回的集合均按键顺序排列。
二、实战示例:从基础到高级排序
示例1:自然排序(成绩排名)
TreeMap<Integer, String> scoreRank = new TreeMap<>();
scoreRank.put(92, "张三");
scoreRank.put(88, "李四");
scoreRank.put(95, "王五");
// 自动按键(分数)升序排列
System.out.println("按分数升序排名: " + scoreRank); // 输出: {88=李四, 92=张三, 95=王五}
// 获取最高分和最低分
System.out.println("最高分: " + scoreRank.lastKey() + " - " + scoreRank.get(scoreRank.lastKey()));
System.out.println("最低分: " + scoreRank.firstKey() + " - " + scoreRank.get(scoreRank.firstKey()));
// 查询90分以上的学生
Map<Integer, String> topScorers = scoreRank.tailMap(90, true);
System.out.println("90分及以上: " + topScorers); // 输出: {92=张三, 95=王五}
示例2:自定义排序(按员工年龄降序)
// 自定义Comparator:按年龄降序
Comparator<Integer> ageDesc = (age1, age2) -> age2.compareTo(age1); // Java 8 Lambda
TreeMap<Integer, String> employees = new TreeMap<>(ageDesc);
employees.put(28, "李雷");
employees.put(35, "韩梅梅");
employees.put(22, "小明");
// 按键(年龄)降序排列
System.out.println("员工按年龄降序: " + employees);
// 输出: {35=韩梅梅, 28=李雷, 22=小明}
三、关键注意事项
- 线程不安全:多线程环境需手动同步(如
Collections.synchronizedSortedMap
包装)。 - 键不可为null:若使用自然排序,键必须实现
Comparable
;自定义Comparator
需明确处理null
。 - 内存开销:红黑树结构比
HashMap
的数组+链表/红黑树占用更多内存。
最佳实践:在需要强顺序保障或频繁范围查询的场景下优先选择TreeMap;纯键值检索且无序需求时,HashMap
通常性能更优。
掌握TreeMap的红黑树内核与排序逻辑,能让你在开发诸如排行榜、调度系统、区间统计等功能时事半功倍,高效驾驭Java集合中的有序力量!