public List subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex);}private class SubList extends AbstractList implements RandomAccess { private final AbstractList parent; private final int parentOffset; private final int offset; int size; SubList(AbstractList parent, int offset, int fromIndex, int toIndex) { this.parent = parent; this.parentOffset = fromIndex; this.offset = offset + fromIndex; this.size = toIndex - fromIndex; this.modCount = ArrayList.this.modCount; } public E get(int index) { rangeCheck(index); checkForComodification(); return ArrayList.this.elementData(offset + index); // 查询也是查的父列表 } public void add(int index, E e) { rangeCheckForAdd(index); checkForComodification(); parent.add(parentOffset + index, e); //父列表也【插入】了 this.modCount = parent.modCount; this.size++; }}
于是可以这样这样移除我不想要的数据:
public static void main(String[] args) { List list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.subList(3, list.size()).clear(); System.out.println("list:" + list);}list:[1, 2, 3]
我突然想这样试一下:
public static void main(String[] args) { List list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); List sub = list.subList(0, 2);// 1,2 sub.add(5); sub.add(6); sub.clear(); list.add(7); list.add(8); System.out.println("sub:" + sub); System.out.println("list:" + list);}Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$SubList.checkForComodification(Unknown Source) at java.util.ArrayList$SubList.listIterator(Unknown Source) at java.util.AbstractList.listIterator(Unknown Source) at java.util.ArrayList$SubList.iterator(Unknown Source) at java.util.AbstractCollection.toString(Unknown Source) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at code.MapTest.main(MapTest.java:20)
果然报错了。。。
直接结论:
前面子类的源码get方法有这么一句: checkForComodification();
private void checkForComodification() { if (ArrayList.this.modCount != this.modCount) throw new ConcurrentModificationException();}