1. 程式人生 > >String中的compareTo與compareToIgnoreCase()方法解析

String中的compareTo與compareToIgnoreCase()方法解析

這個方法的意思是比較兩個字串,不區分大小寫。
我們來看一下這個方法是怎樣實現的?

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