一、解决 Arrays.sort() 排序整数溢出问题
1. 为什么会溢出?
Java 中 int 范围:-2³¹ ~ 2³¹-1(-2147483648 ~ 2147483647)。
排序时如果用 (a, b) -> a - b 这种Lambda减法做比较器:
当 a 是极大正数、b 是极小负数时,a - b 会超出 int 范围,发生整数溢出 ,返回错误的正负值,直接导致排序结果错乱。
溢出示例
java
int a = Integer.MAX_VALUE; // 2147483647
int b = -1;
System.out.println(a - b); // 输出:-2147483648(溢出!本该是正数,结果变成负数)
2. 解决方案(无溢出)
官方推荐 :Integer.compare(a, b)(底层无减法,纯逻辑判断,绝对安全)
替代方案:强转 long 计算 (long)a - b
二、Lambda表达式 (a,b)->a-b 和 Integer.compare(a,b) 的区别
| 对比维度 | (a, b) -> a - b (Lambda) |
Integer.compare(a, b) |
|---|---|---|
| 整数溢出风险 | 有(极端用例必出错) | 无(100%安全) |
| 底层实现 | 减法运算(数值计算) | 纯逻辑判断:x<y?-1:x==y?0:1 |
| 代码可读性 | 差(不直观,易误解) | 优(明确表示「整数比较」) |
| 刷题/生产环境 | 禁止使用(会挂测试用例) | 强制使用 |
| 适用场景 | 仅确定数值范围极小时可用 | 所有场景(通用标准) |
极简总结
只要是排序整数,永远用 Integer.compare(),别用减法Lambda!