2016-12-13 157 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