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;
}
上述为JDK源码。
value是一个常量字符数组,在类中定义是:
private final char value[];
由源码分析可知,len1是源字符串的长度,len2是参数字符串常数。lim为两个字符串的最小长度。
while语句中,从第一个字符开始,将源字符串第n个字符和参数字符串第n个字符,依次递增比较(条件为:在较短字符串长度内),比较过程中,若两字符串相同位置字符不相等,直接返回进行比较的两字符的ASCII码的差值,若字符相等,字符位置递增再进行比较,直到两字符串有不同的字符出现,或者较短字符串全部字符已比较完毕。
若较短字符串为较长字符串的前缀,则返回两者之间的长度差。
注意:此处值得一提的是return关键字,当执行到while语句中的return语句时,跳出循环且后面的语句不会继续执行,函数结束得到返回值。
1、不同字符在较短字符串长度之内时
返回值=原字符串与参数字符串中第一个不同字符相差的ASCII码值,为原减参。
例子如下:
String str1="javasdrip";
String str2="javdscript";
str1.compareTo(str2);
此时返回值为-3,是a的ASCII码(97)减去了d的ASCII码值(100)得到。
注意:只比较第一个不同的字符,后面的d和c也不一样但不会进行比较了。
2、不同字符在较短字符串长度之外时
返回值=原字符串与参数字符串相差的字符个数,原字符串长度大时为正,反之为负。
例子如下:
String str1="java";
String str2="javascript";
str1.compareTo(str2);
此时返回值为-6,是str1相比str2少去的字符个数。
注意:此时只比较位数,而无关ASCII码值,并非是0的ASCII码值减去s的ASCII码值,在参数字符串前面字符和原字符串一样时,返回值就是两者相差的字符个数,即使改变后面的字符也不会影响到返回的值,比如String str2="java123$%^",此时结果仍是-6。
以下为练习巩固:
返回值:
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符串或被比较的字符串有一方到最后一个字符。
- 如果参数字符串等于此字符串,则返回值 0
- 如果此字符串长度小于字符串参数,则返回一个小于 0 的值
- 如果此字符串长度大于字符串参数,则返回一个大于 0 的值
印证1:
public class Test {
public static void main(String args[]) {
String str1 = "Strings";
String str2 = "Strings";
String str3 = "Strings123";
int result = str1.compareTo( str2 );
System.out.println(result);
result = str2.compareTo( str3 );
System.out.println(result);
result = str3.compareTo( str1 );
System.out.println(result);
}
}
以上程序执行结果为:
0
-3
3
印证2:
String str1="abcde";
String str2="abdde";
str1.compareTo(str2);
这时的返回值是-1,即是c的ASCII码(99)减去了d的ASCII码(100)所得。