为何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
相关产品推荐
相关产品推荐

