1. 程式人生 > >Java原始碼學習-String類的compareTo方法

Java原始碼學習-String類的compareTo方法

下面來自jdk中src/java/lang下的String類的compareTo()方法原始碼,反斜線//後面的部分為個人註釋

public int compareTo(String anotherString) {
	int len1 = count;     //當前字串物件的長度
	int len2 = anotherString.count; //當前引數字串物件的長度
	int n = Math.min(len1, len2);   //設定最大比較次數n
	char v1[] = value;
	char v2[] = anotherString.value;
	int i = offset;                 //當前字串開始位置
	int j = anotherString.offset;   //當前引數字串開始位置

	if (i == j) {                   //如果當前物件和引數物件的開始位置相同
	    int k = i;
	    int lim = n + i;
	    while (k < lim) {
		char c1 = v1[k];
		char c2 = v2[k];
		if (c1 != c2) {
		    return c1 - c2;         //返回unicode值的差
		}
		k++;
	    }
	} else {
	    while (n-- != 0) {
		char c1 = v1[i++];
		char c2 = v2[j++];
		if (c1 != c2) {
		    return c1 - c2;
		}
	    }
	}
	return len1 - len2;             //當前n個字元都相同時,返回兩個字串的長度的差
}
關於上述程式碼有兩點理解:

1.為什麼判斷i==j,是否為了少兩次自增/自減操作(j++/n--)?

2.compareTo方法的實際應用場景。

compareTo來自於java.lang.Comparable介面,如同其API中方法的第一句註釋說明:Compares the object with the specified object for order.可見此方法的目的實際為提供一種確定兩個物件先後順序的方法,這樣需要我們去自定義何為“先”,何為“後”的概念(區別於Object類的equals方法,其目的為比較兩個物件是否相同)。

規則可參照java.lang.Comparable介面原碼的註釋部分。