You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Java Comparator比较器返回值异常导致排序结果颠倒?

为什么Arrays.sort使用a[0]-b[0]作为比较器会出现排序异常?

这个问题的核心原因是整数溢出,Java的int类型有固定取值范围:-2147483648到2147483647,当计算超出这个范围的数值时,会发生溢出并得到不符合预期的结果。

具体分析你的场景

当比较输入的两个元素{-2147483646,-2147483645}和{2147483646,2147483647}时,你用的比较器是(a,b)->a[0]-b[0]:

  • 当a是第一个元素,b是第二个元素时,计算a[0]-b[0]即-2147483646 - 2147483646 = -4294967292
  • 这个数值远小于int的最小值-2147483648,发生溢出后,最终得到的int值是4(Java整数溢出遵循模2^32规则,-4294967292 + 2^32 = 4)

而Arrays.sort的比较器规则是:

  • 返回负数:a应排在b前面
  • 返回正数:b应排在a前面
  • 返回0:a和b相等

这里返回了正数,所以排序逻辑会把第二个元素放在第一个元素前面,出现了本该升序却降序的异常。

解决方法

避免直接用a-b的方式比较int类型,改用以下安全的方式:

  • 使用Integer.compare方法,它内部处理了溢出场景:
    Arrays.sort(points, (a,b) -> Integer.compare(a[0], b[0]));
    
  • 或者将数值转为long类型后再比较,避免溢出:
    Arrays.sort(points, (a,b) -> Long.compare((long)a[0], (long)b[0]));
    

这两种方式都能正确判断-2147483646小于2147483646,得到预期的升序结果。

内容的提问来源于stack exchange,提问作者Sakshi Rautela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:51:25