目录
前言
第一种:普通for循环
第二种:利用迭代器
总而言之
前言
不妨以List作为例子,当我们需要对一个字符串数组删去其中包含”6.”前缀的元素时,我们下意识会编写出这样的代码:
-
第一种:普通for循环
这样的写法我们在C/C++里经常用,无非是多使用了Java自带的List.remove()的方法删去元素罢了。我们很当然的觉得程序运行的结果一定是:list中所有元素都被删除,然而….
居然有一个元素没有被删除!这是为什么
最开始时,i=0,list.size()=3,temp=list[0]=6.045,包含”6.”前缀,删去,i++;删除后,list中剩余所有元素都向前移了一位(索引-1:类似于取出队首元素,其他元素自动前进补齐空缺),此时i=1,list.size()=2,temp=list[0]=6.813,包含”6.”前缀,删去,i++;此后list.size()=1,循环结束
所以,其实问题出在了List.remove()方法使用后,元素的索引改变导致某些元素未被访问到,更改方式其实很简单——倒序遍历数组
好耶,和预想的结果相同!!
-
第二种:利用迭代器
如果是接触过迭代器的小伙伴,也可能写出这样的代码
或者引入写法比较简单的增强for循环【实际就是简化版的迭代器,底层实现相同】
这样的写法真是方便又高级,但是怎么会 错啊…
运行结果中抛出异常信息。这是因为触发了集合中并发修改的异常,接下来我们通过源码对抛出异常的原因进行剖析。
在集合的方法中,是通过返回对象来获得迭代器的。是的一个内部类,它实现了接口,代码如下:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!