publicstaticfinalList EMPTY_LIST = new EmptyList<>();
這個list并不具有add、remove元素的能力,我猜想是因為jdk設(shè)計之初的想法是將這個list作為一種只讀的list,并不提供數(shù)據(jù)的寫入能力,因此它僅可作為一種 空值返回,無法進(jìn)行刪除、添加操作。五. list 可以一邊刪除一邊遍歷嗎?答案是肯定可以的,要不然的話list怎么刪除數(shù)據(jù)呢,不過要注意遍歷的姿勢,我們再來看一個簡單的例子:很不幸,又雙叒叕報錯了:仔細(xì)翻閱源碼會發(fā)現(xiàn),每次remove之前會檢查元素的條數(shù),如果發(fā)現(xiàn)預(yù)期的modCount和當(dāng)前的modCount不一致就會拋出這個異常.modCount是list中用來記錄修改次數(shù)的一個屬性,當(dāng)對元素進(jìn)行統(tǒng)計的時候就會對該元素加1,而當(dāng)對list邊遍歷邊刪除的話,就會造成excepted與modCount不一致,從而拋出異常。正確的刪除姿勢就是使用Iterator.remove進(jìn)行遍歷刪除,可以規(guī)避這個問題。
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer integer = iterator.next(); if (integer == 2) { iterator.remove(); } }
六. 總結(jié)JDK 的設(shè)計者有兩個很大的特點:1. 大多不會做非null判斷2. 出現(xiàn)錯誤直接throw new Exception,容錯性很差。在實際開發(fā)中,面對jdk一定要謹(jǐn)慎使用,jdk提供了便利的同時,也有一些我們使用上的盲區(qū),應(yīng)該養(yǎng)成多看源碼,多注意錯誤性處理,防止在小問題上栽大跟頭。回到最開始說的那個subtract方法的問題,因為這個問題等需要我處理完之后用戶才能收到退款,這直接造成了用戶體驗直線下降,而部分用戶還直接打電話投訴。同事一個小小的不謹(jǐn)慎和馬虎就給公司造成了很多負(fù)面影響, 技術(shù)問題雖然不大但是帶來的業(yè)務(wù)影響范圍很嚴(yán)重。所以我們必須防微杜漸,小小的問題都得細(xì)細(xì)的打磨,才能避免很多問題的產(chǎn)生。七. 補充7.1 Bigdecimal在比較的時候,最好使用compareTo方法,不要使用equals方法,如下案例,雖然Bigdecimal重寫了equals方法,但是使用會存在問題: