String的compareTo方法

介绍

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.

总结

  1. 因为这里比较的是字符串,所以调用String类的compareTo方法,如果是int 值,则调用Integer.compareTo方法。
  2. 比较的时候,先获取最小的长度,然后循环比较每个字符,如果比较到不相等的字符,返回它们的ASCII的差,如果循环完了,说明这2个字符串,前lin位都是相等的字符,此时就2中情况,
    第一种是2个字符串,长度也相等,返回0,(例如:"abcd".compareTo("abcd"))。
    第二种情况,前lin位的字符串相等,但是长度不一样,返回长度的差值(例如:"abcd".compareTo("abcde"))。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值