想把一个 int 数组降序排,顺手写了 Arrays.sort(arr, Comparator.reverseOrder()),编译直接报错,说找不到合适的方法。基本类型数组和对象数组,在这上面的规则并不一样。

三个重载各管一段

Arrays.sort(int[]) 把整个数组升序排;Arrays.sort(int[], from, to) 只排区间,左闭右开,传 0 和数组长度就是全排;Arrays.sort(T[], Comparator) 只对引用类型生效,把 Comparator 传给 int[] 会编译失败,因为泛型不接受基本类型。

底层算法不是同一个

int、long、double 这些基本类型走双轴快速排序,速度快但不稳定,相等元素的相对位置会变。Integer、String 这类对象数组走 TimSort 归并变体,稳定,代价是要额外内存。TimSort 对比较器有一致性要求,compare 里对非传递的关系给结果,运行到数据量大时才抛 Comparison method violates its general contract,这种问题很难复现。

降序和自定义比较器怎么写

Integer[] a = {3, 1, 2}; Arrays.sort(a, Comparator.reverseOrder());

基本类型数组想降序,只能自己写两层循环交换,或者装箱成流排一遍再拆回来,数据量大时装箱开销明显。按对象字段排用 Comparator.comparing(Person::getAge),要多级排序就接着 thenComparing;字段可能为 null,用 Comparator.nullsLast 挂上去,不然比到空值就抛空指针。

四个高频错误

  • 当返回值用:Arrays.sort 返回 void,写 arr = Arrays.sort(arr) 编译不过,它是原地排序。
  • 区间算错:to 是开区间,想排前五个元素要传 0 和 5,传 4 会漏掉第 5 个。
  • 直接排二维数组:Arrays.sort(arr) 对 int[][] 按每行首元素升序,行内元素不参与比较,要按列排得自己写比较器。
  • 对 List 用错工具:List 排序用 Collections.sort,或者直接 list.sort,两者底层调的是同一个方法。

判断标准很直白:只有基本类型又只求升序,直接用最省事;一旦要按自定义规则排或要求稳定,就转成对象数组再传比较器,别在基本类型上硬绕。