comparable是类内置的自然排序接口,要求类自身实现compareto()方法,定义唯一默认顺序;comparator是外部排序策略,支持灵活多变的排序规则、null安全及链式组合。
Comparable 是类的“自带排序身份证”
一个类实现了 Comparable 接口,就等于声明:“我有且只有一种公认的自然顺序”。比如 Integer 按数值升序、String 按字典序,都是靠 compareTo() 方法实现的。
- 必须在类内部实现,改排序逻辑就得动源码——耦合高,但语义清晰
- 用在
TreeSet、TreeMap这类有序集合时,不传比较器也能自动排序 -
compareTo()的参数类型和当前类一致(T o),是“自己比别人”,不能接受null,否则抛NullPointerException - 如果类没实现
Comparable,却直接调用Collections.sort(list)或Arrays.sort(arr),会报ClassCastException
Comparator 是“随插随用的排序U盘”
Comparator 不属于类本身,而是外部定义的策略。它解决的是“同一个类,这次按年龄排,下次按姓名排,再下次按分数倒序”的灵活需求。
- 可独立写成类、匿名内部类,或更常用——用 Lambda 表达式,比如
(a, b) -> b.getScore() - a.getScore() - 支持对
null值安全比较(如Comparator.nullsFirst()),而Comparable不行 - 适用于你无法修改原类(比如第三方库的类)但又需要排序的场景
- 多个
Comparator可组合:thenComparing()链式调用实现多级排序
什么时候该选哪个?看这三点
不用背概念,直接对照开发现场做判断: