compareTo()真正返回什么?
Java中的compareTo()
方法返回一个大于/等于/小于0的值,我就知道了。 但是,价值本身就是我的问题。 compareTo()
返回时,2或4之间有什么区别。 看下面的代码
String s1="hello"; String s2="hello"; String s3="meklo"; String s4="hemlo"; System.out.println(s1.compareTo(s2)); // 0 System.out.println(s1.compareTo(s3)); // -5 System.out.println(s1.compareTo(s4)); // -1
为什么最后两个命令是-5和-1?
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo(java.lang.String)
这是词典排序的定义。 如果两个字符串不同,则它们在某个索引处具有不同的字符,这些字符串是两个字符串的有效索引,或者它们的长度不同,或者两者都有。 如果它们在一个或多个索引位置具有不同的字符,则令k为最小的索引; 然后是字符位置k的字符串值较小的字符串,通过使用<运算符确定,按字典顺序排在另一个字符串之前。 在这种情况下,compareTo返回两个字符串中位置k处两个字符值的差值 - 即值:
this.charAt(k)的-anotherString.charAt(k)的
如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。 在这种情况下,compareTo返回字符串长度的差异 – 即值:
this.length()处 – anotherString.length()
compareTo()
返回两个比较字符串中第一个不匹配字符的差异。 如果没有找到不匹配,并且一个字符串比其他字符串短,则返回长度差异 。
"hello".compareTo("meklo") = 'h' - 'm' = -5 ^ ^ and "hello".compareTo("hemlo") = 'l' - 'm' = -1 ^ ^
作为旁注:在条件语句中,非零值通常被认为是true
。 因此, compareTo
可以简单地返回这些非零值,而不是将它们处理为1
( 小优化 )。
如果仔细查看String#compareTo(String)
的源代码,可以看到确切的结果是不明确的。
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
在大多数情况下(即两个字符串的字符不同),它将返回第一个不同字符的char值的整数差异。 否则它将返回两个字符串长度的差异。
超过= 0
, > 0
和< 0
的返回值的解释在实践中应该是Comparable
,因为如果保留了Comparable
的合同,则允许随时更改实现:
将此对象与指定的对象进行比较以获得顺序。 返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。
来源: https : //docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-
确切的值无关紧要 – 可Comparable
(以及Comparator
)接口所关心的是值是负,零还是正。
这是为了简化接口的实现。 实现它时,您可以选择返回基本-1,0或1(如果比较依赖于评估某些条件,这通常是这样),或者如果它更适合您,您可以使用任意负值或正值 – 例如,您可以通过返回this.i - other.i
比较两个整数。
在您的特定示例中,我的猜测是:
-
-1
是第三个字母的代码点的差异:'l' - 'm' == -1
-
-5
是第一个字母的代码点的差异:'h' - 'm' == -5
但重要的是你不应该依赖它 – 这是一个实现细节,根据Comparable
的合同,任何负值都应该被视为相同(“小于”)。