Java基础教程(八十三)集合之使用TreeMap:Java集合红黑树实战,深度掌控TreeMap的排序魔法

一、TreeMap核心机制:红黑树的有序力量

TreeMap 是 SortedMap 接口的核心实现,底层采用红黑树(自平衡二叉查找树)结构存储键值对。红黑树通过约束(节点颜色、黑高度平衡)确保最坏情况下基本操作(插入、删除、查找)的时间复杂度为 O(log n),远优于线性结构。

核心特性:

  1. 自动排序:键(Key)默认按自然顺序(如数字升序、字符串字典序)或构造时指定的 Comparator 排序。
  2. 高效范围查询:提供 subMap(K from, K to), headMap(K to), tailMap(K from) 方法快速获取子视图。
  3. 有序迭代: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=小明}

三、关键注意事项

  1. 线程不安全:多线程环境需手动同步(如 Collections.synchronizedSortedMap 包装)。
  2. 键不可为null:若使用自然排序,键必须实现 Comparable;自定义 Comparator 需明确处理 null
  3. 内存开销:红黑树结构比 HashMap 的数组+链表/红黑树占用更多内存。

最佳实践:在需要强顺序保障或频繁范围查询的场景下优先选择TreeMap;纯键值检索且无序需求时,HashMap通常性能更优。

掌握TreeMap的红黑树内核与排序逻辑,能让你在开发诸如排行榜、调度系统、区间统计等功能时事半功倍,高效驾驭Java集合中的有序力量!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值