2016-12-13 111 views
3

Java中的compareTo()方法返回一个大于/等于/小于0的值,我知道这一点。但是,价值本身就是我的问题。当compareTo()返回时,2或4之间有什么区别。看看下面的代码compareTo()返回什么?

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?

+6

没关系。确切的结果值由任意实现细节确定,这些细节是任意的,因为它们无关紧要。 – user2357112

+0

虽然OpenJDK源代码可以读取 –

回答

7

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

2

compareTo()返回的第一的差无与伦比的字符在两个比较字符串中。如果没有发现不匹配,并且一个字符串比另一个字符串短,则返回的长度差异

"hello".compareTo("meklo") = 'h' - 'm' = -5 
^    ^
and 

"hello".compareTo("hemlo") = 'l' - 'm' = -1 
^    ^

补充说明: 非零值大多认为true条件语句内。因此,compareTo可以简单地返回这些非零值而不是将它们处理成1小优化)。

+0

的确切详细信息,但如果没有不匹配的字符,则可以读取长度的差异。 – Thilo

+0

是的,这是正确的。 –

0

如果仔细查看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<T>#compareTo(T)合同保持:

比较此具有指定对象的对象。返回负整数,零或正整数,因为此对象小于,等于或大于指定的对象。

来源:https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-

0

精确值并不重要 - 所有的Comparable(以及Comparator)接口在乎的是值是负数,零或正。

这是为了使接口的实现变得简单。在实现它时,你可以选择返回基本的-1,0或1(如果比较依赖于评估某些条件,这是常见的),或者如果它更适合你,你可以使用任意的负值或正值。您可以通过返回this.i - other.i来比较两个整数。


在你特别给定的例子,我的猜测是:

  • -1是在第三个字母的代码点区别:'l' - 'm' == -1
  • -5是在第一个字母的代码点区别:'h' - 'm' == -5

但重要的是你不应该依赖它 - 这是一个实施细节,根据Comparable的合同,任何负值应被视为相同(“小于”)。

+0

尽管这通常是正确的,但在“String”情况下不需要进行猜测 - [JavaDoc for String.compareTo](https://docs.oracle.com/javase/8/docs/api/java/lang /String.html#compareTo-java.lang.String-) – Hulk