String中的compareTo與compareToIgnoreCase()方法解析
阿新 • • 發佈:2019-02-08
這個方法的意思是比較兩個字串,不區分大小寫。
我們來看一下這個方法是怎樣實現的?
public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
}
它通過一個引用呼叫一個方法,並將這個要比較的字串和當前類的String物件傳過來。
讓我們來看以下這個引用是哪個類的例項?
public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
我們發現CaseInsensitiveComparator這個類,是String類中的靜態內部類。它實現了comparetor介面,實現了它的compare()方法。
我們來看一下這個compare()方法。
public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
}
顯然,比較的方法是這樣的,找到兩個字串的長度最小的那個,記為min,作為for迴圈的次數,比較他們兩個的前min的char,如果不相同就全都轉換成大寫,如何還不相同,就全部都轉換成小寫,如果還不相同的話,就直接返回。
我們來繼續看conpareTo方法。
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,如果不相等,如下例子,返回str2-str1。
下面是例子。
String str1 = "Stringtest";
System.out.println("compareTo方法"+str1.compareTo("test"));
執行結果
compareTo方法-1