compareTo()真正返回什么?

时间:2016-12-13 06:44:16

标签: java string

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?

4 个答案:

答案 0 :(得分: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()

答案 1 :(得分:4)

compareTo()返回两个比较字符串中第一个不匹配字符的差异。如果没有找到匹配,并且一个字符串比其他字符串短,则返回长度差异

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

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

作为旁注: 在条件语句中,非零值通常被视为true。因此,compareTo可以简单地返回这些非零值,而不是将它们处理为1小优化)。

答案 2 :(得分:0)

如果仔细查看<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="sections" id="section1"></div> <div class="sections" id="section2"></div> <div class="sections" id="section3"></div> <div class="sections" id="section4"></div> <div class="sections" id="section5"></div>的源代码,可以看到确切的结果不明确。

String#compareTo(String)

在大多数情况下(即两个字符串的字符不同),它将返回第一个不同字符的char值的整数差异。否则它将返回两个字符串长度的差异。

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; } = 0> 0之外的返回值的解释在实践中应该无关紧要,因为如果{的合同允许实施,则可以随时更改保留{1}}:

  

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

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

答案 3 :(得分:0)

确切的值无关紧要 - Comparable(以及Comparator)接口关心的是值是负,零还是正。

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

在您的特定示例中,我的猜测是:

  • -1与第三个字母的代码点不同:'l' - 'm' == -1
  • -5与第一个字母的代码点不同:'h' - 'm' == -5

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