先说结论: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个字符每一个字符都相等。
在这个条件下,返回两个字符串长度的差值。如果长度相等就说明是同一个字符串了。
分析完代码可以清楚的看出结论啦~结论放在最开头了~