treeset的first()和last()方法可o(1)获取最小、最大元素,但必须先判空,否则抛出nosuchelementexception;推荐isempty()检查后取值或用optional封装。

TreeSet 的 first() 和 last() 方法能快速获取最小、最大元素,但调用前必须确保集合非空,否则抛出 NoSuchElementException。
first() 和 last() 的行为特点
TreeSet 底层基于红黑树实现,元素天然有序。因此 first() 总是返回排序后最靠前(即最小)的元素,last() 返回最靠后(即最大)的元素。这两个操作时间复杂度为 O(1),比遍历或流式求极值高效得多。
空 TreeSet 调用 first/last 会失败
TreeSet 不允许 null 元素(除非使用自定义比较器且明确支持 null),更关键的是:它不接受空集合下的极值访问。一旦调用 first() 或 last() 时集合为空,立即抛出 NoSuchElementException,不会返回 null 或默认值。
- 错误写法:
treeSet.first()(未判空) - 正确做法:先用
isEmpty()检查,再安全调用 - 注意:size() == 0 与 isEmpty() 效果相同,但后者语义更清晰
安全获取极值的常用方式
推荐在业务逻辑中封装健壮的取值逻辑,避免异常中断流程:
- 判空后取值:
return treeSet.isEmpty() ? null : treeSet.first(); - 使用 Optional 封装(Java 8+):
Optional.ofNullable(treeSet.isEmpty() ? null : treeSet.first()) - 若需默认值,可用三元表达式:
treeSet.isEmpty() ? "N/A" : treeSet.last() - 避免在循环或高频调用中反复判空,可提前缓存结果
替代方案:考虑使用 Collections 工具类
如果只是临时求极值且不依赖 TreeSet 的有序特性,也可将 TreeSet 转为 List 后用 Collections.min/max —— 但这会失去 O(1) 优势,且要求元素实现 Comparable 或传入 Comparator。对已有的 TreeSet,直接调用 first/last 更合理。
不复杂但容易忽略空集合场景,加一行判空就能避免运行时异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











