最常用且高效的方式是单次遍历法——一次循环同时更新最大值和最小值,时间复杂度o(n)、空间复杂度o(1);基础写法初始化max/min为首元,从第二元起比较更新;进阶可用成对比较将比较次数降至约3n/2次;stream方式简洁但需两次遍历且有开销。

Java 中从无序数组中查找最大值与最小值,最常用且高效的方式是**单次遍历法**——只需一次循环,同时更新最大值和最小值变量,时间复杂度为 O(n),空间复杂度为 O(1),无需排序或额外数据结构。
基础单次遍历(推荐初学者掌握)
初始化 max 和 min 为数组第一个元素,然后从第二个元素开始逐个比较:
- 若当前元素 > max,则更新 max
- 若当前元素
适用于所有基本类型数组(如 int[]、double[])和对象数组(需实现 Comparable 或传入 Comparator)。
处理边界情况的关键细节
实际编码中必须考虑这些常见场景,否则易抛出异常或返回错误结果:
- 空数组或 null:应提前校验,抛出 IllegalArgumentException 或返回 Optional.empty()
- 单元素数组:max 和 min 都等于该元素,无需进入循环
- 整型溢出风险(较少见):若数组含 Integer.MAX_VALUE / MIN_VALUE,常规比较仍安全;但若用“减法比较”(如 a - b > 0)则可能溢出,应避免
优化写法:成对比较(减少比较次数)
在对性能极致敏感的场景(如超大数组、高频调用),可采用“两两分组”策略,将比较次数从最多 2n−2 次降至约 3n/2 次:
- 先比较相邻两个元素,确定局部大小关系
- 较小者与当前 min 比较,较大者与当前 max 比较
- 这样每两个元素仅需 3 次比较(而非 4 次)
注意:代码略复杂,需单独处理奇数长度数组的最后一个元素。
使用 Stream(Java 8+,简洁但非最优)
适合快速原型或小数据量,语义清晰但有装箱开销和额外对象创建:
- int max = Arrays.stream(arr).max().orElseThrow();
- int min = Arrays.stream(arr).min().orElseThrow();
⚠️ 注意:这会遍历两次数组;若需同时获取两者,建议改用自定义 Collector 或回归手动遍历。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











