java compare 比较器实现逻辑分析

java compare 比较器实现逻辑分析 ## 标题
1,实现源码,来自package sun.misc.ASCIICaseInsensitiveComparator类

public int compare(String var1, String var2) {
int var3 = var1.length();//获取字符串的长度
int var4 = var2.length();//获取字符串的长度
//获取两个字符串中最短长度的字符串,用于下面的循环,防止循环中报下标越界
int var5 = var3 < var4 ? var3 : var4;

    for(int var6 = 0; var6 < var5; ++var6) {
        char var7 = var1.charAt(var6);
        char var8 = var2.charAt(var6);
assert <boolean表达式>
 	如果<boolean表达式>为true,则程序继续执行。
	如果为false,则程序抛出AssertionError,并终止执行。
     assert var7 <= 127 && var8 <= 127;//Java默认关闭-ea的开关,所以正常程序这里不被执行
    	 //从这里可以看出此方法只对两个不相等的字符进行比较,一直到循环结束
        if (var7 != var8) {
        	//将所有的字符都转成小写来比较
            var7 = (char)toLower(var7);
            var8 = (char)toLower(var8);
            //从这看出该循环体有可能会提前终止,只要两个字符串中的相同下标下的字符出现不相等就会提前得到结果
            if (var7 != var8) {
                //这里的结果只有大于0或者小于0
                return var7 - var8;
            }
        }
    }
	  //这里的最终返回可以看出,如果上面循环体没有得到结果则直接将两个字符串的长度值进行计算,最终返回的结果只能是0,因为能到这里就已经可以说明两个字符串是一样的,且上面循环体里可以看出只做不相等的场景处理
    return var3 - var4;
}

2,实现源码,来自package java.lang.String
public int compareTo(String anotherString) {
//获取字符串的长度,value = char[] 所以是先将字符串分隔成char[]数组
int len1 = value.length;
int len2 = anotherString.value.length;
//这里也是获取两个参数中的最短长度,用于循环
int lim = Math.min(len1, len2);
//得到两个参数的char[]
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++;
    }
    //这里的最终返回可以看出,如果上面循环体没有得到结果则直接将两个字符串的长度值进行计算,最终返回的结果只能是0,因为能到这里就已经可以说明两个字符串是一样的,且上面循环体里可以看出只做不相等的场景处理
    return len1 - len2;
}

3,自己的实现
public int compareTo(String o,String p) {
int v1 = o.length();
int v2 = p.length();
//先判断两个参数的长度是否相等,如果不相等就直接返回两个参数的运算值,减少后续不必要的循环
if(v1 != v2){
return v1 - v2;
}
int v3 = v1 > v2 ? v2 : v1;
for(int i = 0;i < v3;i++){
char c0 = String.valueOf(o.charAt(i)).toLowerCase().charAt(0);
char c1 = String.valueOf(p.charAt(i)).toLowerCase().charAt(0);
if(c0 != c1){
return c0 - c1;
}
}
return v1 - v2;
}

总结点:
1,为什么循环体中只处理不相等的
举个例说明:下面两个参数
v1 = “a123”; 拆成数组 = [‘a’,‘1’,‘2’,‘3’]
v2 = “a123”;拆成数组 = [‘a’,‘1’,‘2’,‘3’]
for()…每次循环v1,v2取值字符的下标都是一样的,所以拿到的值也是一样的,既然是一样的等到的数值的大小也是一样的,所以只要按照单位最大的数且不相等的数往下比就可以了,例如,个十百千万,从最大单位往下比,两个最大的单位只要不相等,后面的小单位就可以忽略不计了,所以循环体中只需要比较不相等的两个字符(同一下标中)
2,为什么方法最后可以直接返回两个参数的的长度相等,且会返回,0,大于0,小于0的结果
2.1 第一点中就已经说的很详细了,原因就是在循环体中已经做了排除操作,如不相等就不会走到最后。
2.2 最终返回结果就很有意思,既然循环体中已经排除了不相等,结果为什么会出现大于或小于0 了?
因为循环体中只循环最小长度的数组,例如:
v1 = “a123”; 拆成数组 = [‘a’,‘1’,‘2’,‘3’,‘4’] ,length = 5
v2 = “a123”;拆成数组 = [‘a’,‘1’,‘2’,‘3’],length = 4
所以最后可以返回 v1-v2,
以上只是java中比较器的实现方式,实现方式很多,大致看了两种,方式都是大同小异

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值