介绍
jdk1.8
测试
@Test
public void testCompareTo(){
System.out.println( "abcd".compareTo("abcd") );//0 (相等)
//长度不同,前4位相同
System.out.println( "abcd".compareTo("abcde") );// -1
System.out.println( "abcd".compareTo("abcdef") );// -2
//长度不同,后者包不含前者
System.out.println( "abcd".compareTo("1bcde") );// 48
System.out.println( "abcd".compareTo("2bcdef") );// 47
//长度想同,内容不同
System.out.println( "abcd".compareTo("1") );// 48
System.out.println( "abcd".compareTo("2bcdef") );// 47
}
执行结果:
0
-1
-2
48
47
48
47
看了上面的结果,来看下String的compare的源码,真相就在这里
public int compareTo(String anotherString) {
int len1 = value.length;@1
int len2 = anotherString.value.length;@2
int lim = Math.min(len1, len2);@3
char v1[] = value;@4
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {@5
return c1 - c2;@6
}
k++;@7
}
return len1 - len2;@9
}
案例举例:
System.out.println( "abcd".compareTo("abcde") );
前面定义为source、后面的定义为target
@1 这里的就是获取source参数的长度,就是4
@2 获取target的长度
@3 取最小的值,长度不一致,及时前面的字符串都相同,循环到这里,表示前lin=4位相同。
@4 将2个参数转成数组,赋值给v1、v2
@5 循环比较,逐个字符比较ASCII值。
@6 如果字符串的ASCII值不相等,返回它们的差
@7 如果相等,再继续比较下一个字符
@8 如果循环到了lim,字符串还相等,跳出循环,用len1-len2,就是这种情况("abcd".compareTo("abcde")
),直接返回-1,如果source、target字符串长度也相等,说明这2个字符串,前面比较了,字符也相等,在这个例子中,返回 5-4,如果这source、target相等,返回 0.
总结
- 因为这里比较的是字符串,所以调用String类的compareTo方法,如果是int 值,则调用Integer.compareTo方法。
- 比较的时候,先获取最小的长度,然后循环比较每个字符,如果比较到不相等的字符,返回它们的ASCII的差,如果循环完了,说明这2个字符串,前lin位都是相等的字符,此时就2中情况,
第一种是2个字符串,长度也相等,返回0,(例如:"abcd".compareTo("abcd")
)。
第二种情况,前lin位的字符串相等,但是长度不一样,返回长度的差值(例如:"abcd".compareTo("abcde")
)。