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#compareTo(T) ,因为如果保留了Comparable#compareTo(T)的合同,则允许随时更改实现:

将此对象与指定的对象进行比较以获得顺序。 返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

来源: 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的合同,任何负值都应该被视为相同(“小于”)。