美文网首页
sublist导致ConcurrentModificationE

sublist导致ConcurrentModificationE

作者: matthewfly | 来源:发表于2021-02-07 10:36 被阅读0次

问题:

通过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.checkForComodification(ArrayList.java:1239) 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临时子集,业务中还是尽量不用。

相关文章

网友评论

      本文标题:sublist导致ConcurrentModificationE

      本文链接:https://www.haomeiwen.com/subject/jltztltx.html