java中有一個(gè)返回子列表的方法:
public list<e> subList(int fromIndex, int toIndex){
subListRangeCheck(fromIndex, toIndex,size);
return new SubList(this , 0, fromIndex, toIndex);
}
返回一個(gè)fromIndex為起點(diǎn)暖途,toIndex為終點(diǎn)(不包含終點(diǎn))的子列表。從上實(shí)現(xiàn)代碼中可以看到膏执,先檢查一下單簽的fromIndex和toIndex是否合法驻售,如果不合法,那么就退出了該函數(shù)邏輯更米。要是合法欺栗,可以看出其返回了一個(gè)this也就是原始列表的部分元素視圖,這樣就形成了一個(gè)子列表征峦。
這也導(dǎo)致了迟几,如果針對(duì)原來的list或者是sublist返回的list的修改(這里的修改是不涉及l(fā)ist大小)栏笆,都是對(duì)同一段內(nèi)存存儲(chǔ)的數(shù)據(jù)做修改类腮。(這種修改叫做非結(jié)構(gòu)修改)
如果發(fā)生結(jié)構(gòu)性修改的是原來的list(不包括由于返回的子list導(dǎo)致的改變),那么返回的子list語義上將會(huì)是undefined蛉加。在AbstractList(ArrayList的父類)中蚜枢,undefined的具體表現(xiàn)形式是拋出一個(gè)ConcurrentModificationException。如果你在調(diào)用了sublist返回了子list之后七婴,如果修改了原list的大小祟偷,那么之前產(chǎn)生的子list將會(huì)失效,變得不可使用打厘。
特別提醒:在使用sublist部分的白盒測(cè)試要重點(diǎn)對(duì)上述情況做測(cè)試修肠。