由String.equals()方法引起的一系列思考
由String.equals()方法引起的一系列思考
问题达人 发表于1年前
由String.equals()方法引起的一系列思考
  • 发表于 1年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 最近在阅读JDK源码中,有String.equals方法实现引起一系列代码优雅、可阅及效率方面的思考。

    废话不多说直接贴String.euqals方法代码

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

在阅读equals方法实现的时候对红色字体的逻辑感觉不够简化(需要多定义一个变量  'i' ),所以自己实现了如下代码(替换红色部分),

while (n != 0) {
    if (v1[--n] != v2[n])
        return false;
}

自认为少定义了一个变量,可以优化代码行数(最近在关注代码质量问题,开始对代码有洁癖,多一行都感觉不够优雅 ^_^),然后心里小高兴的让媳妇(高前端)来探讨(其实就是想炫耀了)。

   我们就在代码优雅及可读性、常规思维的优先级各执己见,突然又想到数组根据下标取数据的效率快慢(这可是决定了我的优化在效率方面是否有提升哇),赶紧查看JDK数组的实现。

    上网查了一些资料却没有找到JDK 数组实现的相关内容,所以只能先暂时放下这个思路(有知道的大神给点提示哇)。另寻思路就是自己实现一个超级大的数组,然后比较数组取第一个元素及取最后一个元素的时间差,于是作者变实现了如下代码:

public static void main(String[] args) {
    int vArr[] = new int[15464691];//jvm默认数组最大值
    int i = 0;
    while(i != 15464691){
        vArr[i] = i++;
    }
    long start = System.currentTimeMillis();
    System.out.println(vArr[0] + " time:" + (start - System.currentTimeMillis()));
    start = System.currentTimeMillis();
    System.out.println(vArr[15464690]+" time:"+(start - System.currentTimeMillis() ));
}

控制打印信息:

    0 time:0(多次运行中,有一次出现-1)
    15464690 time:0

    所以在数组取值的效率这个问题上暂且结论为是没有影响的。

    现在我心里的观点是修改后的逻辑(数组从后往前比较)与常规逻辑(从前往后比较)及代码可阅读性上,对咱广大程序员来说还是小case的,那我觉着能少一个变量的定义、操作,少一行代码,对我来说都是小小的骄傲啊(我又对代码进行了优化哇O(∩_∩)O哈哈~)。

    现在未查找JDK中数组实现原理,所以暂且结论如上,如有哪位大大给指教一下啊。

    然后坐着会继续找一些JDK的数组实现,再进行比较。

 

 

 

标签: jdk 源码阅读
共有 人打赏支持
粉丝 11
博文 89
码字总数 82209
×
问题达人
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: