javacomparable
Ⅰ java 中的 Comparable 与 Comparator 接口使用详解
本文主要介绍Java中的Comparable与Comparator接口的使用场景及使用方法。
要使类的对象支持排序,类需要实现Comparable接口。若一个类未实现Comparable接口,则在使用Arrays.sort()或Collections.sort()对对象集合进行排序时会抛出ClassCastException。实现Comparable接口的类中的compareTo()方法用于比较当前对象与指定对象的先后顺序,返回值可以是正整数、0或负整数,分别表示当前对象大于、等于、小于指定对象。
实现compareTo()方法必须满足几个通用约定,即返回值的符号函数sgn(表达式)为1、0、-1时分别表示表达式为正数、0、负数。例如,自定义一个类Telephone,并实现Comparable接口,compareTo()方法通过使用Integer、String、Integer的compare方法依次对countryCode、areaCode和number进行比较。
为了验证实现效果,编写单元测试用例ComparableTest,准备一个Telephone对象数组,使用Arrays.sort()进行排序,打印结果,结果与compareTo()方法中编写的排序规则一致。
实现Comparable接口表示拥有了一种默认的排序方式,但若想在不修改类本身的情况下使用多种排序规则,这时可以使用Comparator接口。Comparator接口定义了一个compare()方法,实现其compare()方法必须满足与实现Comparable.compareTo()方法完全相同的一组通用约定。
使用Comparator接口时,对应的类无须实现任何接口,因此Telephone可以是一个普通的POJO类。编写单元测试用例ComparatorTest,同样准备一个Telephone对象数组,使用Arrays.sort()进行排序,这次需要传入一个Comparator接口的实现来指定排序规则,例如依次使用countryCode、areaCode和number进行倒序排序。最后打印排序后的数组,结果满足预期。
Comparable接口位于java.lang包下,Comparator接口位于java.util下。Comparable接口是一个Java语言基础接口,而Comparator接口更像是一个工具类,用于在不修改类本身的情况下进行按需排序。
总结,Comparable接口用于提供默认的排序方式,而Comparator接口用于在不修改类本身的情况下实现多种排序规则。实现Comparable接口表示类支持默认的排序功能,而使用Comparator接口可以灵活地应用多种排序逻辑。本文完整示例代码已提交至本人GitHub,欢迎关注或Fork。