悠悠楠杉
网站页面
正文:
TreeMap是Java集合框架中一个基于红黑树(Red-Black Tree)实现的有序映射(SortedMap)。与HashMap基于哈希表实现不同,TreeMap保证了键(Key)的自然顺序或自定义顺序排列,这使得它在需要按顺序处理数据的场景中具有独特优势。其时间复杂度为O(log n),适用于频繁排序和范围查询的操作。
TreeMap的核心是红黑树,一种自平衡的二叉搜索树。每个节点包含键、值、颜色标志(红/黑)及左右子节点引用。红黑树通过旋转和变色规则维持平衡,确保最坏情况下基本操作(插入、删除、查找)的时间复杂度为O(log n)。例如,当插入新键时,TreeMap会按比较器排序并调整树结构:
TreeMap map = new TreeMap<>();
map.put("apple", 10);
map.put("banana", 20);
// 键默认按字典序排列:apple → banana TreeMap支持两种排序方式:
1. 自然排序:键需实现Comparable接口(如String、Integer)。
2. 自定义排序:通过传入Comparator实现灵活排序。例如逆序排列:
TreeMap reverseMap = new TreeMap<>(Comparator.reverseOrder());
reverseMap.put("apple", 10);
reverseMap.put("banana", 20);
// 输出顺序:banana → apple subMap()、headMap()、tailMap()可高效获取子映射。firstKey()、lastKey()快速获取极值。higherKey()、lowerKey()返回相邻键,适用于数据分段处理。示例:统计日志中时间范围内的记录
TreeMap logMap = new TreeMap<>();
logMap.put(LocalDateTime.of(2023, 10, 1, 12, 0), "Event A");
logMap.put(LocalDateTime.of(2023, 10, 2, 15, 0), "Event B");
// 获取2023-10-01全天记录
LocalDateTime start = LocalDateTime.of(2023, 10, 1, 0, 0);
LocalDateTime end = LocalDateTime.of(2023, 10, 1, 23, 59);
Map dailyLogs = logMap.subMap(start, true, end, true); 选择依据:若需要顺序访问或范围查询,用TreeMap;仅需快速查找且不关心顺序,用HashMap。
Collections.synchronizedSortedMap包装。TreeMap将数据存储与顺序管理结合,在调度系统、排行榜、时间序列分析等场景中表现突出。深入理解其实现机制,能帮助开发者在设计复杂数据逻辑时做出更高效的选择。