String類 compareto()方法
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; }
上述為JDK原始碼。
value是一個常量字元陣列,在類中定義是:
private final char value[];
由原始碼分析可知,len1是源字串的長度,len2是引數字串常數。lim為兩個字串的最小長度。
while語句中,從第一個字元開始,將源字串第n個字元和引數字串第n個字元,依次遞增比較(條件為:在較短字串長度內),比較過程中,若兩字串相同位置字元不相等,直接返回進行比較的兩字元的ASCII碼的差值,若字元相等,字元位置遞增再進行比較,直到兩字串有不同的字元出現,或者較短字串全部字元已比較完畢。
若較短字串為較長字串的字首,則返回兩者之間的長度差。
注意:此處值得一提的是return關鍵字,當執行到while語句中的return語句時,跳出迴圈且後面的語句不會繼續執行,函式結束得到返回值。
1、不同字元在較短字串長度之內時
返回值=原字串與引數字串中第一個不同字元相差的ASCII碼值,為原減參。
例子如下:
String str1="javasdrip";
String str2="javdscript";
str1.compareTo(str2);
此時返回值為-3,是a的ASCII碼(97)減去了d的ASCII碼值(100)得到。
注意:只比較第一個不同的字元,後面的d和c也不一樣但不會進行比較了。
2、不同字元在較短字串長度之外時
返回值=原字串與引數字串相差的字元個數,原字串長度大時為正,反之為負。
例子如下:
String str1="java";
String str2="javascript";
str1.compareTo(str2);
此時返回值為-6,是str1相比str2少去的字元個數。
注意:此時只比較位數,而無關ASCII碼值,並非是0的ASCII碼值減去s的ASCII碼值,在引數字串前面字元和原字串一樣時,返回值就是兩者相差的字元個數,即使改變後面的字元也不會影響到返回的值,比如String str2="java123$%^",此時結果仍是-6。
以下為練習鞏固:
返回值:
返回值是整型,它是先比較對應字元的大小(ASCII碼順序),如果第一個字元和引數的第一個字元不等,結束比較,返回他們之間的差值,如果第一個字元和引數的第一個字元相等,則以第二個字元和引數的第二個字元做比較,以此類推,直至比較的字串或被比較的字串有一方到最後一個字元。
- 如果引數字串等於此字串,則返回值 0
- 如果此字串長度小於字串引數,則返回一個小於 0 的值
- 如果此字串長度大於字串引數,則返回一個大於 0 的值
印證1:
public class Test {
public static void main(String args[]) {
String str1 = "Strings";
String str2 = "Strings";
String str3 = "Strings123";
int result = str1.compareTo( str2 );
System.out.println(result);
result = str2.compareTo( str3 );
System.out.println(result);
result = str3.compareTo( str1 );
System.out.println(result);
}
}
以上程式執行結果為:
0
-3
3
印證2:
String str1="abcde";
String str2="abdde";
str1.compareTo(str2);
這時的返回值是-1,即是c的ASCII碼(99)減去了d的ASCII碼(100)所得。