使用Collections.max/min前须确保集合非空且元素可比较,否则抛NoSuchElementException或ClassCastException;推荐用Stream API配合Optional处理,自定义类需实现Comparable或传Comparator,原始数组需转流处理。

直接用 Collections.max 和 Collections.min 前,必须确保集合非空且元素可比较;否则运行时抛 NoSuchElementException 或 ClassCastException。
集合不能为空,否则抛 NoSuchElementException
这两个方法内部会调用 Iterator,空集合触发 next() 失败。Java 不做空检查,也不返回 null —— 它直接炸。
- 安全做法:先判空,再调用
- 或改用 Java 8+ 的流式写法:
list.stream().max(Comparator.naturalOrder()).orElse(null) - 注意:
Optional返回值需显式处理,不能直接解包
元素必须实现 Comparable,或传入 Comparator
若元素类型没实现 Comparable(比如自定义类未重写 compareTo),又没传 Comparator,就会在运行时抛 ClassCastException。
- 字符串、
Integer、LocalDateTime等自带比较逻辑,可直接用 - 自定义类必须实现
Comparable,或每次调用时传Comparator.comparing(...) - 传
Comparator优先级高于自然顺序,例如:Collections.max(list, Comparator.comparing(Person::getAge))
原始类型数组不能直接用,得先转为包装类集合
Collections.max 只接受 Collection extends T>,不支持 int[]、double[] 等原始数组。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
Collections.max(new int[]{1,2,3})→ 编译不过 - 正确路径:用
Arrays.asList()转成List,但注意它不支持基本类型数组(int[]会被当单个元素) - 稳妥方案:用流 +
IntStream:Arrays.stream(arr).max().orElseThrow()
Listwords = Arrays.asList("cat", "elephant", "ant"); String longest = Collections.max(words, Comparator.comparing(String::length)); // → "elephant"
最常被忽略的是:这两个方法是线性扫描,时间复杂度 O(n),但不会改变原集合;如果反复查极值,且集合频繁变动,应考虑维护堆或排序结构,而不是每次都扫一遍。









