測者的測試技術手冊:測試應該關注java.util.List.subList的坑
阿新 • • 發佈:2018-12-17
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將會失效,變得不可使用。
特別提醒:在使用sublist部分的白盒測試要重點對上述情況做測試。