math.max 和 math.min 是 java 中高效、类型安全的极值获取方法,支持 int、long、float、double 重载,但不支持 byte、short、char 或 null 包装类;nan 返回 nan,±0.0 比较保留符号;多值极值需嵌套、stream 或第三方库。

Math.max 和 Math.min 是 Java 中最直接、最常用获取两个数极值的方法,无需自己写比较逻辑,底层用的是三元运算符,高效且类型安全。
基本用法:传入两个同类型数值
这两个方法都重载了多种数值类型(int、long、float、double),但**不支持 byte、short、char 或 Integer 等包装类直接传入(会自动拆箱,但 null 会抛 NullPointerException)**。
-
Math.max(5, 3)→ 返回5 -
Math.min(-2.5, 1.8)→ 返回-2.5 -
Math.max(0L, -10L)→ 返回0L(注意 long 字面量加 L)
常见陷阱与注意事项
容易出错的地方不在逻辑,而在类型匹配和边界情况:
- 传入
Double.NaN时,Math.max和Math.min都返回NaN(不是抛异常) - 正零(+0.0)和负零(-0.0)参与比较时,
Math.min(+0.0, -0.0)返回-0.0,Math.max(+0.0, -0.0)返回+0.0 - 不能直接传
null的包装类型,如Math.max(a, b)中若a或b是null的Integer,会触发NullPointerException
扩展:多个数取极值怎么办?
Java 原生不提供三参数以上的 max/min,但有几种实用方式:
- 嵌套调用:
Math.max(Math.max(a, b), c) - 用
Stream(适合集合或数组):Arrays.stream(nums).max().orElse(Integer.MIN_VALUE) - 第三方库如 Guava 的
Ints.max(a, b, c, ...)或 Apache Commons Math 的MathUtils.max(...)
替代写法(不推荐,仅作理解)
虽然可以手写三元表达式,比如 a > b ? a : b,但不如 Math.max 清晰、健壮:
- 缺少对 NaN 的明确定义行为
- 类型隐式转换可能引发意外(如 int 和 double 混用)
- 可读性和维护性差,尤其在复杂表达式中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











