arrays.sort()对自定义类型排序需实现comparable接口以定义自然顺序:类声明implements comparable,重写compareto()返回负数/正数/0表示小于/大于/等于,支持arrays.sort()等自动调用,但仅限一种稳定排序规则。

Arrays.sort() 对自定义类型排序时,必须明确“怎么比”。如果类本身有公认的主排序逻辑(比如学生默认按学号升序、商品默认按价格升序),就该让这个类实现 Comparable 接口。
Comparable 是类的“自然排序契约”
它要求类主动声明自己“知道怎么跟同类比大小”。
实现方式很简单:
- 类声明 `implements Comparable
`(T 是自身类型)
- 重写 `public int compareTo(T other)` 方法
- 方法返回负数 → 当前对象小;正数 → 当前对象大;0 → 相等
例如学生类按分数降序排:
Tome
Tome是一款面向叙事型页面和演示内容创作的 AI storytelling 工具。
下载
class Student implements Comparable<student> {
String name;
double score;
public int compareTo(Student other) {
return Double.compare(other.score, this.score); // 注意顺序:other在前→降序
}
}</student>
之后直接 Arrays.sort(students) 就生效,无需额外参数。
只允许一种自然顺序,但足够清晰
一个类只能实现一个 `compareTo()`,所以 `Comparable` 适合稳定、通用的排序规则。
它不灵活,但好处是:
- 调用方干净简洁,`Arrays.sort(arr)` 一行搞定
- 语义明确:“这就是它的本来样子”
- 兼容 `Collections.sort()`、`TreeSet`、`TreeMap` 等所有依赖自然序的结构
注意 null 和类型安全
- `compareTo()` 中不要对 `other` 直接调用方法前不做非空检查,否则可能抛 `NullPointerException`
- 推荐用 `Objects.compare()` 或 `Integer.compare()`、`Double.compare()` 等工具方法,避免手动减法(如 `a - b` 可能溢出)
- 泛型声明要准确,比如 `implements Comparable`,不是 `Comparable