Arrays.sort() 报 ClassCastException 是因元素未实现 Comparable 接口,解决方法为实现 Comparable 或传入 Comparator;Comparator 更灵活,链式调用顺序决定排序优先级,TreeSet/Map 的 Comparator 会持久生效。
为什么 Arrays.sort() 直接报 ClassCastException
因为 Java 默认不认得你的类怎么比大小。Arrays.sort() 和 Collections.sort() 要求元素实现 Comparable 接口,否则运行时抛出 ClassCastException: YourClass cannot be cast to java.lang.Comparable。
解决方法只有两个:要么让类自己实现 Comparable,要么外部传一个 Comparator。别指望编译器自动推断字段顺序。
- 实现
Comparable适合「自然排序」逻辑稳定、单一的场景(比如按 ID 升序是唯一合理默认) - 用
Comparator更灵活,支持多字段、逆序、空值处理,也避免污染领域对象
实现 Comparable 时 compareTo() 怎么写才安全
核心原则:必须满足自反性、对称性、传递性,且不能返回随机值或依赖可变字段。常见翻车点:
- 用
==比较引用类型字段(比如name == other.name)→ 改用Objects.equals(a, b) - 数值字段直接减法(如
this.age - other.age)→ 可能整型溢出,改用Integer.compare(this.age, other.age) - 忽略
null:若字段可能为null,必须显式判断,或用Comparator.nullsFirst(Comparator.naturalOrder())
示例(安全写法):
立即学习“Java免费学习笔记(深入)”;
public class User implements Comparable {
private String name;
private Integer age;
@Override
public int compareTo(User o) {
int nameCmp = Objects.compare(this.name, o.name, String::compareTo);
if (nameCmp != 0) return nameCmp;
return Integer.compare(this.age, o.age); // 不用 this.age - o.age
}
}