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

为何List.sort传入的实参顺序与compare方法的形参顺序不一致?

Java List.sort 中 Comparator 参数传递顺序的困惑与解释

在使用Java的List.sort方法时,会遇到一个反直觉的现象:集合中元素的顺序和Comparator接口compare方法的形参接收顺序不匹配。

问题复现代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

class SampleComparator implements Comparator<Sample> {
    public int compare(Sample param1, Sample param2) {
        System.out.println("1st param is " + param1.getNum() + ", 2nd param is " + param2.getNum()); // 实际输出:1st param is 2, 2nd param is 1

        if (param1.getNum() < param2.getNum()) {
            return 1;
        }
        if (param1.getNum() > param2.getNum()) {
            return -1;
        }
        return 0;
    }
}

class Sample {
    private int num;
    public Sample(int num) {
        this.num = num;
    }
    public int getNum() {
        return num;
    }
}

public class SampleSort {
    public static void main(String[] args) {
        Sample[] obj = {
                new Sample(1), // 集合第一个元素
                new Sample(2)  // 集合第二个元素
        };
        List<Sample> list = new ArrayList<>(Arrays.asList(obj));
        list.sort(new SampleComparator());
    }
}

预期与实际输出差异

  • 预期输出:1st param is 1, 2nd param is 2
  • 实际输出:1st param is 2, 2nd param is 1

原因解释

这并非Bug,而是Java API的刻意约定:sort方法调用compare时,可能会反向传递参数——把集合中原本的第二个元素作为compare的第一个形参传入,第一个元素作为第二个形参传入。

这种设计是为了提升比较器的灵活性:通过调整参数传递顺序,开发者可以更便捷地定义“第一个参数大于/小于第二个参数”的比较逻辑,无需额外修改比较器的核心判断逻辑。

字符串排序示例验证

class SampleComparator implements Comparator<String> {
    public int compare(String param1, String param2) {
        System.out.println("1st param is " + param1 + ", 2nd param is " + param2); // 实际输出:1st param is A, 2nd param is B
        return param1.compareTo(param2);
    }
}

public class SampleSort {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("B"); // 集合第一个元素
        list.add("A"); // 集合第二个元素
        list.sort(new SampleComparator());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:53:17