subList方法拆分集合问题
分享一个有意思的错误,先看代码
public static void main(String[] args) throws IllegalAccessException { ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } List<Integer> aList = list.subList(0, 2); List<Integer> bList = list.subList(2, 4); ArrayList<Integer> cList = new ArrayList<>(); cList.add(1); aList.addAll(cList); for (Integer i : bList) { System.out.println(i); } }
逻辑很简单,将一个有10个元素的集合拆分为两个集合aLis和bList,然后创建一个新的集合cList,添加一个数据,之后调用addAll方法,将cList添加到aList中,最后遍历bList
看着代码没啥问题吧,运行:
这个是啥错呢?网上搜了一下大部分都是说在循环中不能对list集合进行修改,但是上面的代码中并没有在循环中修改啊???很迷惑
要想搞明白这个问题先来看看for循环的本质是什么
写一段for循环的代码.使用idea插件jclasslib
可以看到,在代码中使用的for循环,而编译器给你编译为字节码后其实是一个迭代器
那么直接写成迭代器的形式方便下面的观察,将上面的代码最后一段for循环改为
Iterator<Integer> iterator = bList.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
从list的subList方法入手
public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex);}
能看到如果使用了subList进行拆分,那么给你返回的不是一个创建时使用的ArrayList了,而是返回了一个SubList,可以通过反射来获取类名证明返回的是一个subList类
继续查看SubList这个类
发现它是一个ArrayList的内部类,同ArrayList都继承了AbstractList类
注意这个SubList的有参构造最后一行,在调用subList方法后,就将当前List的modCount值赋值给了SubList类
那么现在有几个问题:啥时候报的错,为什么报错,在哪报的错,我们直接debug看
当走完addAll()方法后idea已经开始提示会出现bug,当我们继续走完bList.iterator()方法后,程序出错,然后退出
也就是说在调用iterator()方法后,出现的错误,我们继续debug进入查看
到最后发现ArrayList的modCount和SubList类中的modCount判断不同,所以才抛出的错误
那modCount是干啥的?简单来讲就是记录当前集合被更改的次数
上面的三个问题已经解决了
啥时候报的错:当调用iterator()方法时
为什么报错:ArrayList的modCount和SubList类中的modCount值不同
在哪报的错:bList的iterator()方法里
那么现在又有新的问题:ArrayList的modCount值什么时候改的?为什么对aList进行addAll操作,循环bList会出错?
debug看看addAll()方法
而修改的这个属性是在Abs......
原文转载:http://www.shaoqun.com/a/888693.html
跨境电商:https://www.ikjzd.com/
pocket:https://www.ikjzd.com/w/1903
tinypic:https://www.ikjzd.com/w/114
飞书互动:https://www.ikjzd.com/w/1319.html
遇到的一个离谱的问题subList方法拆分集合问题分享一个有意思的错误,先看代码publicstaticvoidmain(String[]args)throwsIllegalAccessException{ArrayList<Integer>list=newArrayList<>();for(inti=0;i<10;i++){list.add(i);}List<
世界无烟日主题内容2021:http://www.30bags.com/a/430792.html
世界五大佛教圣地之一,屹立山西百年不变!慕名吸引无数国外游人!:http://www.30bags.com/a/223614.html
世界五大致命温泉 想要命的一定看清楚 :http://www.30bags.com/a/435843.html
世界鲜华之国,欧洲最开放的国家之一荷兰,这些旅游景点值得一去:http://www.30bags.com/a/292546.html
英语老师解开胸罩喂我乳 老师的胸好大好软真好吃:http://lady.shaoqun.com/a/247804.html
口述实录:一个少妇的做爱日记:http://lady.shaoqun.com/a/250745.html
一个添下面两个吃奶 跟两个男人同时做真爽:http://lady.shaoqun.com/a/247871.html
男朋友舌头在我花缝不停的来回添 吸住小核到抽搐:http://www.30bags.com/m/a/249700.html
深圳鹏城丹青展览需要门票吗:http://www.30bags.com/a/513867.html
深圳鹏城丹青展览开了吗:http://www.30bags.com/a/513868.html
大鹏金岭路后山至丰树山段绿道怎么去:http://www.30bags.com/a/513869.html
2021深圳儿童戏剧节在哪里看演出:http://www.30bags.com/a/513870.html
没有评论:
发表评论