treemap 的 firstkey() 和 lastkey() 以 o(1) 时间直接返回最小和最大键,依赖红黑树对最左/最右节点的引用;需先用 isempty() 判断非空,否则抛 nosuchelementexception;支持自定义 comparator 改变极值定义,且不允许 null 键(除非 comparator 显式支持)。

TreeMap 是 Java 中基于红黑树实现的有序映射,天然支持按键升序排列,因此 firstKey() 和 lastKey() 是 O(log n) 时间复杂度下获取最小键和最大键的最直接方式——实际是 O(1),因为红黑树维护了指向最左/最右节点的引用,无需遍历。
firstKey() 和 lastKey() 的基本用法
这两个方法不接受参数,直接返回当前 TreeMap 中最小或最大的键。前提是 Map 非空,否则抛出 NoSuchElementException。
-
firstKey():返回最小键(即自然顺序下排最前的键) -
lastKey():返回最大键(即自然顺序下排最后的键) - 若使用自定义
Comparator,则按该比较器定义的顺序确定“最小”和“最大”
安全调用:避免 NoSuchElementException
务必在调用前检查 TreeMap 是否为空,推荐用 isEmpty() 判断:
if (!treeMap.isEmpty()) {
K minKey = treeMap.firstKey();
K maxKey = treeMap.lastKey();
// 使用 minKey / maxKey
}
不能依赖 try-catch 捕获异常来控制流程,这属于反模式,影响可读性和性能。
配合 headMap/tailMap 快速切片极值区间
想获取“小于等于最大键的所有项”或“大于等于最小键的子集”,可组合使用:
-
treeMap.headMap(treeMap.lastKey(), true)→ 包含最大键的前缀子图 -
treeMap.tailMap(treeMap.firstKey(), true)→ 等价于原图(常用于语义强调) - 更实用的是:用
firstKey()+floorKey(K)或lastKey()+ceilingKey(K)实现边界对齐查询
注意 null 键与自定义比较器的影响
TreeMap 不允许 null 键(除非显式传入允许 null 的 Comparator,如 Comparator.nullsFirst(naturalOrder())),此时 firstKey() 可能返回 null;同样,自定义比较逻辑会彻底改变“极值”的含义:
// 按字符串长度降序
TreeMap<string integer> map = new TreeMap((a, b) -> Integer.compare(b.length(), a.length()));
map.put("hi", 1);
map.put("hello", 2);
map.put("a", 3);
// firstKey() → "hello"(最长),lastKey() → "a"(最短)</string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











