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

Java中ArrayList的Comparator(i1-i2)实现升序排序原理详解

为什么(i1, i2) -> i1 - i2能让ArrayList升序排序?

先看你给出的Comparator实现:

Comparator<Integer> ints = (i1, i2) -> i1 - i2;

要理解它的作用,得先明确Java中Comparator接口的compare(i1, i2)方法的返回规则:

  • 返回负数:表示i1应该排在i2的前面
  • 返回0:表示i1和i2的相对位置无需改变
  • 返回正数:表示i1应该排在i2的后面

这个Lambda表达式本质就是实现了上述规则:

  • 当i1 < i2时,i1 - i2是负数 → i1排在i2前面,符合升序逻辑
  • 当i1 == i2时,返回0 → 两者位置不变
  • 当i1 > i2时,i1 - i2是正数 → i1排在i2后面(也就是i2排前面),同样符合升序逻辑

接下来结合初始数组[5, 4, 1, 2],用直观的冒泡排序步骤(Java实际排序用TimSort,冒泡更易理解)演示整个过程:

排序步骤演示

初始数组:[5, 4, 1, 2]

第一轮遍历(将最大元素移至末尾)

  1. 对比元素5和4:5-4=1(正数)→ 5应排在4后面,交换位置后数组变为[4, 5, 1, 2]
  2. 对比元素5和1:5-1=4(正数)→ 5应排在1后面,交换位置后数组变为[4, 1, 5, 2]
  3. 对比元素5和2:5-2=3(正数)→ 5应排在2后面,交换位置后数组变为[4, 1, 2, 5]
    此时最大元素5已处于正确的末尾位置。

第二轮遍历(处理前3个元素)

  1. 对比元素4和1:4-1=3(正数)→ 4应排在1后面,交换位置后数组变为[1, 4, 2, 5]
  2. 对比元素4和2:4-2=2(正数)→ 4应排在2后面,交换位置后数组变为[1, 2, 4, 5]
    此时第二大元素4已处于正确位置。

第三轮遍历(处理前2个元素)

对比元素1和2:1-2=-1(负数)→ 1应排在2前面,无需交换,数组保持[1, 2, 4, 5]

至此排序完成,最终得到升序数组。

内容的提问来源于stack exchange,提问作者Anish Ghimire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:43:25