由String.equals()方法引起的一系列思考
2019獨角獸企業重金招聘Python工程師標準>>>
? ? 廢話不多說直接貼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的數組實現,再進行比較。
?
?
?
轉載于:https://my.oschina.net/u/2307114/blog/713232
總結
以上是生活随笔為你收集整理的由String.equals()方法引起的一系列思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java servlet拾遗(1)-Se
- 下一篇: [Machine Learning] l