关于函数式接口Comparator的疑惑

函数式接口中可以额外定义多个抽象方法,但这些抽象方法签名必须和Object的public方法一样
接口最终有确定的类实现, 而类的最终父类是Object。 因此函数式接口可以定义Object的public方法。

If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface’s abstract method count
since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.
如果一个接口声明一个抽象方法来重写java.lang.object的一个公共方法,那么该方法也不计入接口的抽象方法计数。
因为接口的任何实现都将具有java.lang.object或其他地方的实现。

既然Object类里有了的方法,为什么在接口里还要定义抽象方法?
方便要求实现类中实现方法的复写,定义自己指定的toString(),equals(),hashcode()方法。

Note that it is always safe not to override Object.equals(Object). However, overriding this method may, in some cases, improve performance by allowing programs to determine that two distinct comparators impose the same order.
请注意,不重写object.equals(object)始终是安全的。但是,在某些情况下,重写此方法可能会通过允许程序确定两个不同的比较器使用相同的顺序来提高性能。

首先,为什么说不重写equals总是安全的。因为java中很多Collection你在取值时,实际是通过hashCode()来实现的。如果你重写了object的equals方法,可能意味着原来不相等的两个值现在奇怪的相等了,或是两个原来相等的值现在相等了。由此可能造成你原来存进去的值现在没法取出来。再者,为什么Comparator也有一个equals方法。接口是并不继承Object类的。这个方法用来比较其他对象是否等于这个比较器。当指定的对象也是一个比较器,并且和这个Comparator执行相同的顺序时,该方法返回true.

为什么Comparator也有一个equals方法。接口是并不继承Object类的。这个方法用来比较其他对象是否等于这个比较器。当指定的对象也是一个比较器,并且和这个Comparator执行相同的顺序时,该方法返回true.”

实际上我的问题就在这,接口虽然不是继承Object类,但实现接口的类肯定是继承Object的,那么这个类就会有equals()方法了。如果需要重写,就重写;不需要,可以不用管。 所以我不知道到底这个接口里定义的这个equals()有什么用?或者说,明明是已经有了的方法,为什么还要重复定义?

上面资料里已经说了,接口里的equals方法是比较两个比较器是否相等的。而重写Object的equals方法是比较此对象与另一个OBJ是否相等的。

注意,不去重写Object的equals方法总是安全的。但是,重写这个方法也许,在某些情况下,(有助于)提高效率,——因为这就允许程序作出这样的判断:两个不同的Comparator实现导致的排序结果其实是相同的。(比如两个Comparator分别对同一个巨大的集合排序,你要想知道结果是不是相同,就可以通过两个 Comparator 的 equals 结果知道,而不用去比较两个巨大的结果集合了)接口里面写上这个方法,我猜就是为了能有一个合适的地方写下这段注释,提醒程序员注意到这种对Comparator实现重写equals的可能性。当然,根据Object类里的equals协议,如果重写equals那就是说hashCode也要同时重写,这个还是要遵守的。

个人整理
https://www.debugease.com/j2se/174931.html
https://bbs.csdn.net/topics/391078889

你可能感兴趣的:(java)