技術點:注意Java的java.util.List.subList的坑

java中有一個返回子列表的方法:java

public list<e> subList(int fromIndex, int toIndex){
       subListRangeCheck(fromIndex, toIndex,size);
       return new SubList(this , 0, fromIndex, toIndex);
}

返回一個fromIndex爲起點,toIndex爲終點(不包含終點)的子列表。從上實現代碼中能夠看到,先檢查一下單籤的fromIndex和toIndex是否合法,若是不合法,那麼就退出了該函數邏輯。要是合法,能夠看出其返回了一個this也就是原始列表的部分元素視圖,這樣就造成了一個子列表。函數

這也致使了,若是針對原來的list或者是sublist返回的list的修改(這裏的修改是不涉及list大小),都是對同一段內存存儲的數據作修改。(這種修改叫作非結構修改)測試

若是發生結構性修改的是原來的list(不包括因爲返回的子list致使的改變),那麼返回的子list語義上將會是undefined。在AbstractList(ArrayList的父類)中,undefined的具體表現形式是拋出一個ConcurrentModificationException。若是你在調用了sublist返回了子list以後,若是修改了原list的大小,那麼以前產生的子list將會失效,變得不可以使用。this

特別提醒:在使用sublist部分的白盒測試要重點對上述狀況作測試。spa

擴展閱讀

相關文章
相關標籤/搜索