1. 程式人生 > >測者的測試技術手冊:測試應該關注java.util.List.subList的坑

測者的測試技術手冊:測試應該關注java.util.List.subList的坑

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

  1. public list<E> subList(int fromIndex, int toIndex){

  2.       subListRangeCheck(fromIndex, toIndex,size);

  3.       return new SubList(this , 0, fromIndex, toIndex);

  4. }

返回一個fromIndex為起點,toIndex為終點(不包含終點)的子列表。從上實現程式碼中可以看到,先檢查一下單籤的fromIndex和toIndex是否合法,如果不合法,那麼就退出了該函式邏輯。要是合法,可以看出其返回了一個this也就是原始列表的部分元素檢視,這樣就形成了一個子列表。

這也導致了,如果針對原來的list或者是sublist返回的list的修改(這裡的修改是不涉及list大小),都是對同一段記憶體儲存的資料做修改。(這種修改叫做非結構修改)

如果發生結構性修改的是原來的list(不包括由於返回的子list導致的改變),那麼返回的子list語義上將會是undefined。在AbstractList(ArrayList的父類)中,undefined的具體表現形式是丟擲一個ConcurrentModificationException。如果你在呼叫了sublist返回了子list之後,如果修改了原list的大小,那麼之前產生的子list將會失效,變得不可使用。

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

關注測者,關注測試