方法定义

Java 的 Math 类提供了静态方法用于比较数值:

// 整数类型
public static int max(int a, int b)
public static int min(int a, int b)

// 长整型
public static long max(long a, long b)
public static long min(long a, long b)

// 浮点型
public static float max(float a, float b)
public static float min(float a, float b)

// 双精度浮点型
public static double max(double a, double b)
public static double min(double a, double b)

功能说明

  • max(a, b): 返回参数 ab 中的较大值。
  • min(a, b): 返回参数 ab 中的较小值。
  • 特殊值处理:
    • 若任一参数为 NaN(非数字),结果返回 NaN
    • 正零(0.0)和负零(-0.0)比较时,min 返回负零,max 返回正零。
    • 正负无穷大按数学规则比较(如 max(Double.POSITIVE_INFINITY, 5) 返回正无穷大)。

示例代码

// 整数比较
int maxInt = Math.max(10, 20); // 20
int minInt = Math.min(10, 20); // 10

// 浮点数比较
double maxDouble = Math.max(15.5, 10.2); // 15.5
double minDouble = Math.min(15.5, 10.2); // 10.2

// 特殊值示例
double nanResult = Math.max(Double.NaN, 100); // NaN
double zeroResult = Math.min(0.0, -0.0);      // -0.0

使用技巧

  1. 多值比较:嵌套调用实现多值比较。
    int maxOfThree = Math.max(a, Math.max(b, c));
    
  2. 数组最值:结合循环求数组最值。
    int[] nums = {3, 5, 1, 8};
    int minVal = nums[0];
    for (int i = 1; i < nums.length; i++) {
        minVal = Math.min(minVal, nums[i]);
    }
    
  3. 边界控制:用于限制数值范围。
    // 确保 value 在 [0, 100] 范围内
    int clampedValue = Math.max(0, Math.min(value, 100));
    

常见错误

  1. 忽略 NaN 的传染性
    double result = Math.max(10, Double.NaN); // 结果为 NaN
    // 应提前检查:if (Double.isNaN(a) || Double.isNaN(b)) ...
    
  2. 类型不匹配
    // 编译错误:参数类型不一致
    double error = Math.max(5, 10.5f); // 需显式转换:Math.max(5.0, 10.5f)
    
  3. 空数组处理
    int[] arr = {};
    int max = arr[0]; // 抛出 ArrayIndexOutOfBoundsException
    // 应先检查数组长度!
    

注意事项

  1. 浮点数精度
    • 浮点数比较可能因精度问题产生意外结果(如 Math.max(0.1 + 0.2, 0.3) 可能返回 0.30000000000000004)。
  2. 正负零区别
    • min(0.0, -0.0) 返回 -0.0,某些场景需特殊处理。
  3. 性能敏感场景
    • 在密集循环中,直接比较(如 a > b ? a : b)可能比 Math.max() 更高效(但 JIT 通常已优化)。

最佳实践与性能优化

  1. 批量处理数据
    • 避免在循环中多次调用,可缓存中间结果。
    // 低效:多次调用 Math.max
    for (int i = 0; i < n; i++) {
       max = Math.max(max, data[i]);
    }
    
    // 高效:直接比较
    for (int i = 0; i < n; i++) {
       if (data[i] > max) max = data[i];
    }
    
  2. 整数优化
    • 对整数使用位运算(仅限高级优化):
      int customMax(int a, int b) {
          return a & ((a - b) >> 31) | b & (~(a - b) >> 31);
      }
      

      注意:可读性差,仅在极端性能需求时使用。

  3. 浮点型检查
    • 涉及浮点数时,优先处理 NaN 和无穷大:
      double safeMax(double a, double b) {
          if (Double.isNaN(a) || Double.isNaN(b)) return Double.NaN;
          return Math.max(a, b);
      }
      

总结

关键点 说明
功能 快速比较两个数值,返回较大值(max)或较小值(min)。
数据类型支持 支持 int, long, float, double
特殊值处理 NaN 返回 NaN;正负零按 IEEE 754 标准处理。
使用场景 边界控制、数组最值、多值比较。
性能建议 在密集循环中优先使用直接比较替代 Math.max/min
错误预防 检查 NaN、空数组,确保类型一致。

实践口诀

两数比大小,Math 轻松搞;
多值嵌套调,数组循环跑;
NaN 要警惕,性能循环考。

通过掌握方法特性、规避常见陷阱,并结合场景优化,可高效利用 Math.max()Math.min() 解决比较问题。