Java TreeMap 完全掌握:有序 Map 实战指南
Java TreeMap
探索 Java TreeMap 类 — 强大的天然有序 Map 实现 — 含清晰示例、关键操作与高级导航技巧。
TreeMap 类属于 Java 集合框架,提供红黑树实现,按键的自然顺序或自定义 Comparator 保持条目有序。它实现 NavigableMap 接口,新增便捷方法用于遍历和查询 Map。
创建 TreeMap
使用前先导入包:
import java.util.TreeMap;
再创建实例:
TreeMap<Key, Value> numbers = new TreeMap<>();
默认按键自然升序排序。需自定义顺序时,向构造器传入 Comparator。
- Key — 每个条目的唯一标识符。
- Value — 与键关联的数据。
TreeMap 方法概览
该类提供丰富操作。下文按关键类别附代码片段。
插入元素
put()— 添加或替换键值对。putAll()— 合并另一个 Map。putIfAbsent()— 键缺失时才插入。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
evenNumbers.putIfAbsent("Six", 6);
System.out.println("偶数 TreeMap: " + evenNumbers);
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.putAll(evenNumbers);
System.out.println("数字 TreeMap: " + numbers);
}
}
输出
偶数 TreeMap: {Four=4, Six=6, Two=2}
数字 TreeMap: {Four=4, One=1, Six=6, Two=2}
访问元素
使用集合视图
entrySet()— 返回所有键值对。keySet()— 返回所有键。values()— 返回所有值。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("TreeMap: " + numbers);
System.out.println("键值映射: " + numbers.entrySet());
System.out.println("Keys: " + numbers.keySet());
System.out.println("Values: " + numbers.values());
}
}
输出
TreeMap: {One=1, Three=3, Two=2}
键值映射: [One=1, Three=3, Two=2]
Keys: [One, Three, Two]
Values: [1, 3, 2]
获取值
get()— 返回键对应的值,缺失返回null。getOrDefault()— 键缺失时返回默认值。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("TreeMap: " + numbers);
int value1 = numbers.get("Three");
System.out.println("get(): " + value1);
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("getOrDefault(): " + value2);
}
}
输出
TreeMap: {One=1, Three=3, Two=2}
get(): 3
getOrDefault(): 5
移除条目
remove(key)— 删除条目并返回其值。remove(key, value)— 仅当键映射到指定值时删除。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("TreeMap: " + numbers);
int removed = numbers.remove("Two");
System.out.println("移除的值: " + removed);
boolean removedPair = numbers.remove("Three", 3);
System.out.println("条目 {Three=3} 是否移除? " + removedPair);
System.out.println("更新后的 TreeMap: " + numbers);
}
}
输出
TreeMap: {One=1, Three=3, Two=2}
移除的值: 2
条目 {Three=3} 是否移除? true
更新后的 TreeMap: {One=1}
替换值
replace(key, value)— 更新键对应的值。replace(key, old, new)— 仅当当前值匹配old时更新。replaceAll(function)— 对每个条目应用函数。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("原始 TreeMap: " + numbers);
numbers.replace("Second", 22);
numbers.replace("Third", 3, 33);
System.out.println("replace() 后: " + numbers);
numbers.replaceAll((k, v) -> v + 2);
System.out.println("replaceAll() 后: " + numbers);
}
}
输出
原始 TreeMap: {First=1, Second=2, Third=3}
replace() 后: {First=1, Second=22, Third=33}
replaceAll() 后: {First=3, Second=24, Third=35}
导航方法
因 TreeMap 实现 NavigableMap,提供高效查询结构的方法。
首尾元素
firstKey()— 顺序中的首键。firstEntry()— 首键的条目。lastKey()— 尾键。lastEntry()— 尾键的条目。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("TreeMap: " + numbers);
System.out.println("First Key: " + numbers.firstKey());
System.out.println("Last Key: " + numbers.lastKey());
System.out.println("First Entry: " + numbers.firstEntry());
System.out.println("Last Entry: " + numbers.lastEntry());
}
}
输出
TreeMap: {First=1, Second=2, Third=3}
First Key: First
Last Key: Third
First Entry: First=1
Last Entry: Third=3
Ceiling、Floor、Higher、Lower
这些方法返回相对于给定键的键或条目,便于范围查询。
higherKey()、higherEntry()— 下一个更高键/条目。lowerKey()、lowerEntry()— 前一个更低键/条目。ceilingKey()、ceilingEntry()— ≥ 给定键的最小键/条目。floorKey()、floorEntry()— ≤ 给定键的最大键/条目。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 5);
numbers.put("Third", 4);
numbers.put("Fourth", 6);
System.out.println("TreeMap: " + numbers);
System.out.println("higherKey('Fourth'): " + numbers.higherKey("Fourth"));
System.out.println("higherEntry('Fourth'): " + numbers.higherEntry("Fourth"));
System.out.println("lowerKey('Fourth'): " + numbers.lowerKey("Fourth"));
System.out.println("lowerEntry('Fourth'): " + numbers.lowerEntry("Fourth"));
System.out.println("ceilingKey('Fourth'): " + numbers.ceilingKey("Fourth"));
System.out.println("ceilingEntry('Fourth'): " + numbers.ceilingEntry("Fourth"));
System.out.println("floorKey('Fourth'): " + numbers.floorKey("Fourth"));
System.out.println("floorEntry('Fourth'): " + numbers.floorEntry("Fourth"));
}
}
输出
TreeMap: {First=1, Fourth=6, Second=5, Third=4}
higherKey('Fourth'): Second
higherEntry('Fourth'): Second=5
lowerKey('Fourth'): First
lowerEntry('Fourth'): First=1
ceilingKey('Fourth'): Fourth
ceilingEntry('Fourth'): Fourth=6
floorKey('Fourth'): Fourth
floorEntry('Fourth'): Fourth=6
Polling 与范围视图
pollFirstEntry() 和 pollLastEntry() 分别移除并返回首/尾条目。
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("TreeMap: " + numbers);
System.out.println("pollFirstEntry(): " + numbers.pollFirstEntry());
System.out.println("pollLastEntry(): " + numbers.pollLastEntry());
System.out.println("更新后的 TreeMap: " + numbers);
}
}
输出
TreeMap: {First=1, Second=2, Third=3}
pollFirstEntry(): First=1
pollLastEntry(): Third=3
更新后的 TreeMap: {Second=2}
headMap、tailMap、subMap
这些方法提供特定键范围的视图。
headMap(toKey, inclusive)— 键 < toKey(含时 ≤)。tailMap(fromKey, inclusive)— 键 ≥ fromKey(不含时 >)。subMap(fromKey, fromInclusive, toKey, toInclusive)— 两边界之间的键。
示例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
numbers.put("Fourth", 4);
System.out.println("TreeMap: " + numbers);
System.out.println("headMap('Fourth'): " + numbers.headMap("Fourth"));
System.out.println("headMap('Fourth', true): " + numbers.headMap("Fourth", true));
System.out.println("tailMap('Second'): " + numbers.tailMap("Second"));
System.out.println("tailMap('Second', false): " + numbers.tailMap("Second", false));
System.out.println("subMap('Fourth', true, 'Third', false): " + numbers.subMap("Fourth", true, "Third", false));
}
}
输出
TreeMap: {First=1, Fourth=4, Second=2, Third=3}
headMap('Fourth'): {First=1}
headMap('Fourth', true): {First=1, Fourth=4}
tailMap('Second'): {Second=2, Third=3, Fourth=4}
tailMap('Second', false): {Third=3, Fourth=4}
subMap('Fourth', true, 'Third', false): {Fourth=4, Second=2}
其他工具方法
| 方法 | 说明 |
|---|---|
clone() | 创建 Map 浅拷贝 |
containsKey() | 检查键是否存在 |
containsValue() | 检查特定值 |
size() | 返回条目数 |
clear() | 移除所有条目 |
使用 Comparator 自定义键顺序
需不同排序(如逆序、大小写不敏感字符串)时,实现 Comparator 并传给 TreeMap 构造器。
import java.util.TreeMap;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>(new CustomComparator());
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
numbers.put("Fourth", 4);
System.out.println("TreeMap: " + numbers);
}
static class CustomComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
// 逆序
return a.compareTo(b) * -1;
}
}
}
输出
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
更多 Comparator 信息请见官方 Java 文档。
java
- MATLAB 数值类型详解:存储、转换与范围查询
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 掌握 Java 集合算法:排序、打乱、搜索与更多实用操作
- Java 生成随机数实战:Random 与 Math.random 详解