把API文档的内容发给你吧
这是String中compareTo的定义
public int compareTo(String anotherString)
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象在参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只有在方法 equals(Object) 返回 true 时才返回 0。
TreeSet判断比较性主要来自两个方面一个是元素自身的compareTo()(来自Comparable接口),一个是通过构造函数载入的实现Comparator接口的比较器的compare(),下面再给出Comparable
API文档中Comparable项关于compareTo的说明里,有这么一句话:
强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序
这样一来compareTo和equals的关系就很明了了compareTo是用来比较自然顺序的,若大于返回正数,小于返回负数,等于则返回0,而是否等于0,准确来说,和equals的结果是无关的,当然,大部分情况,还是要求和equals结果一致,那什么时候可以不一致呢?
我们知道TreeSet是实现Set结果的,Set的特点是无序,元素不重复。那TreeSet是怎么判断不重复的呢?老毕视频里应该明确讲过,判断标准是先用红黑树判断,换言之可以使compareTo判断,若判断结果为0,则继续用equals判断,所以equals是对compareTo判断元素相等后的补充方案,在某些特殊情况,比如我们想放入几个实际内容相等的元素进TreeSet时,就可以将compareTo的结果与equals结果不相关联,当然,这种情况,我们一般称为非主流情况,哈哈。 |