2 sinat 32906793 sinat_32906793 于 2016.01.21 19:48 提问

java集合父集和子集操作异常

创建list集合添加元素sublist()得到子集,为什么不能对父集进行增删等操作??运行抛出concurrentmodification

2个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.21 21:02
已采纳

出现这个异常存在的原因是在遍历集合的同时,又对集合元素进行修改导致的。比如这段代码:

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");
        List<String> subList = list.subList(1, 2);
        list.add("to");
        System.out.println(subList);
    }

分析下这个问题产生的原因:ArrayList的实现是基于数组的,它维护了一个Object[]数组对象。
跟踪下subList方法的源码就知道,subList操作返回的新的List,它的数组引用跟原来的父列表是同一个,只是索引的起止值不同罢了。
所以上述代码先对父类集合add操作了,然后又遍历子集合对象时,就会抛出上述异常了。
至于上述异常产生的原因,参考一楼。即遍历集合的同时又对集合进行修改的话,就会报java.util.ConcurrentModificationException异常了。

sinat_32906793
sinat_32906793 谢谢二位
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you 但是如果不涉及到遍历操作即注释掉最后一行,就没有错误了。
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.21 19:55
sinat_32906793
sinat_32906793 就是创建一个父集有四个元素,获取了两个元素的子集合,然后对父集合做添加一个元素的操作,抛出了concurrentmodification异常,若是没有子集或者只对子集合做添加操作没有任何异常
接近 2 年之前 回复
sinat_32906793
sinat_32906793 那个网址里说明的是迭代时的修改会有异常,我在没有使用迭代时对父集合的操作抛出了一场
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!