问题:
通过ArrayList.subList截取子列表,而后添加进原列表造成列表修改冲突,测试代码如下:
@Test
public void t() {
List<Integer> result = Lists.newArrayList(1, 3, 4, 6);
List<Integer> temp = result.subList(0, 3);
result.clear();
result.addAll(temp);
}
抛出错误:
java.util.ConcurrentModificationException
at java.util.ArrayListSubList.size(ArrayList.java:1048)
at java.util.AbstractCollection.toArray(AbstractCollection.java:136)
at java.util.ArrayList.addAll(ArrayList.java:581)
原因:
看ArrayList.subList的内部实现:
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
返回的是ArrayList内部类SubList的一个实例,再看SubList构造方法:
SubList(AbstractList<E> 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;
}
sublist返回的只是ArrayList的一个镜像,一切操作都是映射到原始ArrayList上的。
另外SubList也不能强转ArrayList,可以理解为ArrayList临时子集,业务中还是尽量不用。
网友评论