废话很少说直接贴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的数组实现,再进行比较。