看到这样一道面试题,发现我对Arraylist的sublist方法了解的不够深
借助这次机会决定好好看看这个sublist方法
从源码解读
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
返回一个SubList类(里面的一个内部类)
后面的add和remove方法,类似,操作原Arraylist
看到这里就可以做一下总结了:
示例Demo
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(20, 30, 40, 10));
List<Integer> subList = list.subList(2, 4);
printList(list);
printList(subList);
// "非结构性修改",不改变长度,父子视图之间相互影响
System.out.println("子视图进行了非结构性修改");
subList.set(0, 400);
printList(list);
printList(subList);
System.out.println("父视图进行了非结构性修改");
list.set(2, 300);
printList(list);
printList(subList);
// "结构性修改",改变长度,
System.out.println("子视图进行了结构性修改,同时影响父视图");
subList.add(50);
printList(list);
printList(subList);
System.out.println("父视图进行了结构性修改,子视图失效(下面会报错)");
list.add(60);
printList(list);
printList(subList); // 此处异常
}
/**
* 打印集合元素
*/
private static void printList(List<Integer> list) {
for (Integer i : list) {
System.out.print(i + "->");
}
System.out.println();
}
还有一个应用:
删除list集合中某段数据(应用到了,子视图结构性修改,影响父视图)
list.sublist(2,5).clear();