先说结论:compareTo比较两个字符串是在第一个字符不相同的前提下,返回第一个字符的差值,如果第一个字符相同,就返回第二个字符的差值,以此类推。如果前n个字符都相等(n是比较小的那个字符串的长度),就返回两个字符串长度的差值。


把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;
     }

一句一句分析:

(1)public int compareTo(String anotherString) {

compareTo()方法的返回值是int类型的,有一个String类型的参数取名叫anotherString。


(2)

int len2 = anotherString.value.length;

定义了两个int型变量len1和len2,分别获取调用这个compareTo方法的字符串的长度和参数中传递的字符串的长度。这里的value就是字符串本身。

public String() {
         this.value = "".value;
     }

(3) int lim = Math.min(len1, len2);

定义了一个int型变量lim,他的值是len1和len2中的最小值,也就是两个字符串里比较短的字符串中字符的个数。

(4)    char v1[] = value;
       

把调用这个compareTo方法的字符串的每一个字符转换到字符型数组v1[]中,把参数中传递的字符串的每一个字符转换到字符型数组v2[]中。

(5)  int k = 0;

while (k < lim) {
             char c1 = v1[k];
             char c2 = v2[k];
             if (c1 != c2) {
                 return c1 - c2;
             }
             k++;
         }

这里一个while循环放在一起说了。定义一个int型变量k初始值为0,当k小于lim也就是小于(两个字符串中)比较小的字符串的长度时,执行while循环。(注意底部有个k++,也就是说这个while循环一共会执行lim次(分别是k=0一直到k=(lim-1)的时候))

接着将两个字符型数组中的第k个字符取出来,如果不相等的话,直接return他们的差值(char作为基本数据类型是可以相减的),这个差值是调用这个compareTo方法的字符串的第k个字符减去参数中传递的字符串的第k个字符差值。如果两个数组第k个字符相等的话,这次循环就只做一个k++。

(6)   return len1 - len2;

最后一句了,这句执行的条件是while循环中没有执行return语句,也就是说两个字符串前lim个字符每一个字符都相等。

在这个条件下,返回两个字符串长度的差值。如果长度相等就说明是同一个字符串了。



分析完代码可以清楚的看出结论啦~结论放在最开头了~