Comparable和Comparator接口的区别

        Comparator接口中存在两个抽象方法compare()方法和equals()方法,但是在实现Comparator接口时只需要重写compare()方法即可,因为equals()方法在所有类的父类Object中已经存在并继承,所以并不需要再重写equals()方法,而且虽然Comparator接口并没有使用@FunctionalInterface标签注解也不是函数式接口,但是由于接口中存在的equals()方法是Object类中已经实现过的,所以对于编译器而言并不算作抽象方法,所以在获取Comparator接口的实现类对象时仍然可以使用Lambda表达式进行代码书写。

1、声明一个接口CarInter并声明两个Object类中已经实现的抽象方法equals()、hashCode()、一个并没有被Object类实现的抽象方法add()方法

Comparable和Comparator接口的区别_第1张图片

2、声明一个测试类A并在A类中声明一个需要传递CarInter接口实现类对象的方法

Comparable和Comparator接口的区别_第2张图片 

3、在类的main方法中创建A类对象并调用eat()方法,此时我们发现在使用匿名内部类时只需要重写add()方法即可,所以同样就可以使用Lambda表达式进行书写 

Comparable和Comparator接口的区别_第3张图片

4、于是我们知道对于接口中的抽象方法,如果在方法在Object类中已经实现,那么对于编译器而言就不算做抽象方法(对于编译器而言的意思是编译器在编译过程中接口中那些已经在Object类中实现的方法已经存在方法体)

        Comparator接口在使用时通常需要传递接口实现类的对象作为方法的参数,但是由于方法传递的对象我们并不会使用,只会使用对象实现的compare()方法所以我们通常会采用匿名内部类的方式创建接口实现类的对象,并且由于接口中只存在一个抽象方法compare()所以可以采用Lambda表达式的方法进行代码书写,并且这种方式并不会改变待排序对象类中的代码。

        Comparable接口中只存在一个抽象方法compareTo(),一般如果需要自定义对象的排序规则就需要在类中实现Comparable接口并重写compareTo()方法,会破坏类中原有的代码并且排序规则一旦书写如果需要修改排序规则则需要在类中进行修改,灵活性较差。

Comparable和Comparator接口的区别_第4张图片

        所以说对于Java中自定义的类,如果我们需要改变其原本的排序规则,我们并不能通过实现Comparable接口来修改规则,因为我们并不能对源码进行修改所以我们只能使用创建Comparator构造器接口实现类的对象重定义排序规则,相比于Comparable接口具有更高的灵活性。 

Comparable和Comparator接口的区别_第5张图片

为什么Comparator接口中存在equals()方法?Comparable和Comparator接口的区别_第6张图片 

        这个我也看不懂,大概意思是然而,在某些情况下,通过允许程序确定两个不同的比较器施加相同的顺序,覆盖此方法可能会提高性能。 

 

你可能感兴趣的:(java)