由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数组的实现。jvm

    上网查了一些资料却没有找到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:0this

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

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

    如今未查找JDK中数组实现原理,因此暂且结论如上,若有哪位大大给指教一下啊。变量

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

相关文章
相关标签/搜索