subString() 和 subList()名字差不多,很多的人可能就直接顾名思义,照着subString()的用法来使用subList(),这里先画一下重点:subList()返回的列表的幕后就是原列表,因此,对返回的列表的修改都会反应到原列表中,反之亦然。
List subList(int fromIndex,int toIndex);
它返回的是原来List的 [fromIndex,toIndex) 部分的“视图”。(之所以说是“视图”,是因为返回的List并不是一个新的List,他的幕后仍旧是原List)。
代码:
public static void main (String[] args){
List<String> stringList = new ArrayList<String>();
Collections.addAll(stringList,"A","B","C","D","E","F");
List<String> subList = stringList.subList(1,4);
System.out.println(subList);//输出: [B, C, D]
Collections.shuffle(subList);//打乱子列表顺序
System.out.println(subList);//输出: [C, D, B]
System.out.println(stringList);//输出: [A, C, D, B, E, F] ::原列表也随之发生变化
Collections.shuffle(stringList);//打乱原列表顺序
System.out.println(stringList); //输出: [E, B, A, F, C, D]
System.out.println(subList);//输出: [B, A, F] ::子列表也随之发生变化
subList.add("G");//增加子列表长度
System.out.println(subList); //输出: [B, A, F, G]
System.out.println(stringList);//输出: [E, B, A, F, G, C, D] ::原列表也随之发生变化
stringList.add("H");//增加原列表长度
//System.out.println(subList);//输出: 编译报错,原列表大小发生变化,子列表将无法使用。
System.out.println(stringList);//输出: [E, B, A, F, G, C, D, H]
}
运行结果:
结论:
- 子列表内容发生变化,原列表也随之发生变化。
- 子列表大小发生变化,原列表也随之发生变化。
- 原列表内容发生变化,子列表也随之发生变化。
- 原列表大小发生变化,子列表将不可用。
拓展:
如何删除一个List的某个区段?
可利用subList()的这个特性,如:
list.subList(fromIndex,toIndex).clear();
如何把一个List分割成两个(或数个)?
同理:
List sub = one.subList(fromIndex,toIndex);
List two = new XxxList(sub);
sub.clear();