Comparable和Comparator接口的区别

Comparator接口虽无@FunctionalInterface注解,但因equals()已由Object实现,故可使用Lambda。接口中的equals()用于优化性能,允许比较器确定相同顺序。相比Comparable,Comparator提供更灵活的排序规则定制,尤其在无法修改源码时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

 

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

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

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

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

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

为什么Comparator接口中存在equals()方法? 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值